我只是了解提供者,并进行演示。我有A,B 2页,以及A页用户消费者可以使用模型的值。一个页面有一个按钮,然后单击它可以打开B页面,当它打算转到B页面时,将重建A页面的客户,然后返回到A页面,这也使A页面的使用者重建了。这是怎么回事?有人可以帮助我吗?谢谢。我搜索了很多文章,但没有人推荐。有我的代码。
型号
class PageModel with ChangeNotifier {
int _count = 0;
void addCount() {
_count += 5;
notifyListeners();
}
int get count => _count;
}
主要
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Provider.debugCheckInvalidValueType = null;
return MyHomePage();
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_)=> PageModel(),
child: MaterialApp(
home: ProviderPage(),
),
);
}
}
一页
class ProviderPage extends StatefulWidget {
@override
Widget build(BuildContext context) {
print('ProviderPage create');
}
@override
State<StatefulWidget> createState() {
return ProviderPageState();
}
}
class ProviderPageState extends State<ProviderPage> with AutomaticKeepAliveClientMixin {
@override
void initState() {
super.initState();
print('initState');
}
@override
Widget build(BuildContext context) {
super.build(context);
return Scaffold(
body: Container(
margin: EdgeInsets.only(top: 100),
child: Column(
children: <Widget>[
Consumer<PageModel>(builder: (context, data, _) {
print('ProviderPage Text ${data.count}');
return Text('${data.count}');
}),
// Text('${Provider.of<PageModel>(context).count}'),
Builder(builder: (_) {
print('builder RaisedButton');
return RaisedButton(onPressed: () {
Provider.of<PageModel>(context, listen: false).addCount();
}, child: Text('+5'),);
}),
RaisedButton(onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) {
return ProviderPage1();
}
),);
}, child: Text('intent'),)
],
),
),
);
}
@override
void didChangeDependencies() {
print('didChangeDependencies');
super.didChangeDependencies();
}
@override
void didUpdateWidget(ProviderPage oldWidget) {
print('didUpdateWidget');
super.didUpdateWidget(oldWidget);
}
@override
bool get wantKeepAlive => true;
}
B页
class ProviderPage1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('B create');
return Scaffold(
body: Container(
margin: EdgeInsets.only(top: 100),
child: Center(
child: Column(
children: <Widget>[
// Consumer<PageModel>(builder: (context,data,_) {
// print('ProviderPage1 Text');
// return Text('${data.count}');
// }),
// Text('${Provider.of<PageModel>(context).count}'),
// Builder(builder: (_){
// print('builder RaisedButton1');
// return RaisedButton(onPressed: (){
// Provider.of<PageModel>(context,listen: false).addCount();
// },child: Text('+5'),);
// }),
],
),
),
),
);
}
}
您可以参考当推入新页面时,导航器堆栈上的页面将重建https://github.com/flutter/flutter/issues/11655
Flutter团队的回复https://github.com/flutter/flutter/issues/11655#issuecomment-348287396这按预期工作。通常,您应该假设所有小部件都可以随时重建,而大多数情况下它们并不是最优化的。
特别是,由于导航器的状态已更改,因此路线将重建,因此它们可能需要更新回退按钮等的方式。
https://github.com/flutter/flutter/issues/11655#issuecomment-412413030通常,您应该假设每个小部件都会在每个框架上进行重新构建,并且将构建方法设计为幂等的(即多次运行它们应该与一次运行没有什么不同),并且运行速度快(因此,大量运行它们没有问题) )。在实践中,我们运行构建方法的频率要少一些,但是您不应该依赖它。