【问题标题】:Flutter Provider rebuild widget on page intentFlutter Provider 在页面意图上重建小部件
【发布时间】:2020-03-24 03:18:14
【问题描述】:

我只是了解提供者,并制作一个演示。我有A,B 2页面和A页面用户消费者使用模型的价值。 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】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 2019-12-09
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      相关资源
      最近更新 更多