本文介绍如何使用Flutter的Provider包控制BottomNavigationBar组件。
什么是Provider?
Provider
是Flutter团队推荐的新的状态管理方法。
注:
setState
在许多地方同样能正常使用,但是如果庞杂的代码中有FutureBuilder
创建setState
则会最终导致问题。
接下来展示如何在BottomNavigationBar导航中如何使用Provider。
第一步:pubspec.yaml中添加依赖
provider:
第二步:创建Provider类
class BottomNavigationBarProvider with ChangeNotifier {
int _currentIndex = 0;
get currentIndex => _currentIndex;
set currentIndex(int index) {
_currentIndex = index;
notifyListeners();
}
}
该类使用Provider存储BottomNavigationBar的选中值,并且通过notifyListeners()函数更新tab。
第三步:使用ChangeNotifierProvider包装(Wrap)父组件
home: ChangeNotifierProvider<BottomNavigationBarProvider>(
child: BottomNavigationBarExample(),
create: (BuildContext context) => BottomNavigationBarProvider(),
),
通过使用ChangeNotifierProvider
对BottomNavigationBarExample()
第四步:完成BottomNavigationBar全部代码
在底部导般创建三个组件,全部代码如下:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ChangeNotifierProvider<BottomNavigationBarProvider>(
child: BottomNavigationBarExample(),
create: (BuildContext context) => BottomNavigationBarProvider(),
),
);
}
}
class BottomNavigationBarExample extends StatelessWidget {
@override
Widget build(BuildContext context) {
var provider = Provider.of<BottomNavigationBarProvider>(context);
var currentTab = [
Home(),
Profile(),
Setting(),
];
return Scaffold(
body: currentTab[provider.currentIndex],
bottomNavigationBar: BottomNavigationBar(
currentIndex: provider.currentIndex,
onTap: (index) {
provider.currentIndex = index;
},
items: [
BottomNavigationBarItem(
icon: new Icon(Icons.home),
title: new Text('Home'),
),
BottomNavigationBarItem(
icon: new Icon(Icons.person),
title: new Text('Profile'),
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
title: Text('Settings'),
)
],
),
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Container(
alignment: Alignment.center,
height: 300,
width: 300,
child: Text(
"Home",
style: TextStyle(color: Colors.white, fontSize: 30),
),
color: Colors.amber,
)),
);
}
}
class Profile extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Container(
alignment: Alignment.center,
height: 300,
width: 300,
child: Text(
"Profile",
style: TextStyle(color: Colors.white, fontSize: 30),
),
color: Colors.blue,
),
),
);
}
}
class Setting extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Container(
alignment: Alignment.center,
height: 300,
width: 300,
child: Text(
"Settings",
style: TextStyle(color: Colors.white, fontSize: 30),
),
color: Colors.cyan,
)),
);
}
}
class BottomNavigationBarProvider with ChangeNotifier {
int _currentIndex = 0;
get currentIndex => _currentIndex;
set currentIndex(int index) {
_currentIndex = index;
notifyListeners();
}
}
运行结果如下:
1_sdr1LXWBXsCS1xdHUG98jg.gif
网友评论