【问题标题】:Flutter provider loosing value when navigating to another screen导航到另一个屏幕时 Flutter 提供者失去价值
【发布时间】:2020-03-29 01:24:31
【问题描述】:

我是Flutterprovider package 的新手,所以任何帮助都会很棒,所以我的main.dart 文件的问题如下:

 void main() => runApp(
      MaterialApp(
        debugShowCheckedModeBanner: false,
        theme: ThemeData.light(),
        home: ChangeNotifierProvider(
          create: (_) => InterestingMomentProvider(),
          child: Home(),
        ),
     ),
  );

这构建了我的Home 小部件,我不会全部发布它,因为它非常大,但是,我点击一个按钮,它会将一个字符串传递给提供程序类并将其添加到列表中概述如下:

import 'package:flutter/widgets.dart';

class InterestingMomentProvider extends ChangeNotifier {

  List<String> _moments = [];

  List<String> get moments => _moments;

  void addMoment(String time){
    _moments.add(time);
  }

  int momentsTotal(){
    return _moments.length;
  }

}

在 addMoment 方法上添加断点我可以确认 _moments 包含所有字符串。

然后我按下一个按钮导航到另一个屏幕,导航代码如下:

Navigator.push(context, MaterialPageRoute(builder: (context) => MomentsRecorded()),);

MomentsRecorded 小部件如下:

class MomentsRecorded extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Moments'),
        centerTitle: true,        
      ),
      body: Center(
        child: MomentsList()
        ),
    );
  }
}

第一个错误是:

Could not find the correct Provider<InterestingMomentProvider> above this Consumer<InterestingMomentProvider> Widget

To fix, please:

  * Ensure the Provider<InterestingMomentProvider> is an ancestor to this Consumer<InterestingMomentProvider> Widget
  * Provide types to Provider<InterestingMomentProvider>
  * Provide types to Consumer<InterestingMomentProvider>
  * Provide types to Provider.of<InterestingMomentProvider>()
  * Always use package imports. Ex: `import 'package:my_app/my_code.dart';
  * Ensure the correct `context` is being used.

然后我将主体调整为如下所示,错误消失了:

 body: Center(
        child: ChangeNotifierProvider(
          create: (_) => InterestingMomentProvider(),
          child: MomentsList())
        ),

但是在 MomentLists 小部件中,我尝试循环访问提供程序类中的时刻列表,但是当调试 _moments 为 0 时?

MomentsList 小部件:

class MomentsList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<InterestingMomentProvider>(
      builder: (context, momentData, child){
        return momentData.momentsTotal() > 0 ? ListView.builder(
          itemCount: momentData.momentsTotal(),
          itemBuilder: (BuildContext context, int index) {
            final moment = momentData.moments[index];
            return ListTile(
                title: Text(moment),
            );
          }
        ) : Center(child: Text('no moments recorded'),);
      }

    );
  }
}

有人能解释一下为什么会这样吗?

【问题讨论】:

    标签: flutter provider state-management


    【解决方案1】:

    发生这种情况,因为您的提供程序是在MaterialApphome 属性中定义的,所以当您更改路由时,提供程序也会被删除。

    解决方案:将提供程序移到 MaterialApp 上方,如下所示:

     void main() => runApp(
      ChangeNotifierProvider(
        create: (_) => InterestingMomentProvider(),
        child: MaterialApp(
          debugShowCheckedModeBanner: false,
          theme: ThemeData.light(),
          home: Home()
        ),
      ),
    );
    

    如果您担心这不对 - checkout the docs, they doing the same

    【讨论】:

    • 我正处于学习 Flutter 的早期阶段,所以任何比我经验丰富的开发人员提供的任何文档或建议我都一定会倾听。以上工作,非常感谢,我一定会检查文档并按照示例进行操作。
    • 谢谢兄弟,我花了好几个小时才弄清楚这一点。终于,我得到了你的答案。
    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2010-11-09
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多