Flutter Provider在页面意图上重建小部件



我只是了解了提供者,并做了一个演示。我有a、B2和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'),);
//              }),
],
),
),
),
);
}
}

当推送新页面时,您可以在Navigator堆栈重建中引用页面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
您通常应该假设每个小部件都将在每个帧重建,并将构建方法设计为幂等(即多次运行它们与一次运行它们没有什么不同(和快速(这样大量运行它们就没有问题(。在实践中,我们运行构建方法的频率低于此,但您不应该依赖于此。

相关内容

  • 没有找到相关文章

最新更新