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

问题描述 投票:0回答:1

我只是了解提供者,并进行演示。我有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'),);
//              }),
            ],
          ),
        ),
      ),
    );
  }

}
flutter dart provider
1个回答
0
投票

您可以参考当推入新页面时,导航器堆栈上的页面将重建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通常,您应该假设每个小部件都会在每个框架上进行重新构建,并且将构建方法设计为幂等的(即多次运行它们应该与一次运行没有什么不同),并且运行速度快(因此,大量运行它们没有问题) )。在实践中,我们运行构建方法的频率要少一些,但是您不应该依赖它。

© www.soinside.com 2019 - 2024. All rights reserved.