Flutter提供者导航到另一个屏幕时失去了价值

棘轮密码

我是新手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'),);
      }

    );
  }
}

有人可以解释为什么会这样吗?

程序

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

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

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

如果您担心这不合适,请签出文档,他们会这样做

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从提供者函数获取价值到另一个页面

在颤振中使用提供者功能后如何导航到另一个页面?

Ninject提供者->在提供者内部获取另一个依赖

导航到另一个页面时Redux失去状态

使用另一个提供者的实例在 TestBed 中实例化一个提供者

搜索时键入一个符号后,TextInput失去了焦点

Flutter:从StreamBuilder构建器回调内部导航到另一个屏幕

Flutter ListView 单击导航到另一个屏幕

如果导航到 Flutter 上的另一个屏幕,则停止计时器

如何导航到另一个屏幕

从一个屏幕导航到另一个屏幕时,未处理的承诺被拒绝

导航到另一个屏幕时,为什么仍显示“底部标签”?

导航到另一个屏幕时出现广播接收器问题

使用 Ionic 2 在通知单击时导航到另一个屏幕

导航到另一个屏幕时关闭模态

在 React Native Tab 导航中导航到另一个屏幕时,如何明确地退出屏幕?

访问服务提供者中的另一个数据库

当从另一个页面调用时,提供者方法返回null

在实体框架中将数据从一个提供者实时传输到另一个提供者

Android / Java将价值从一个屏幕传递到另一个屏幕并显示价值

如何在Flutter中加载时导航到另一个页面

如何在Flutter中从一个屏幕导航到另一个屏幕(开始活动)并关闭当前屏幕(完成)

Viewmodel 失去了它的一些价值

导航到一个屏幕 tp 另一个

在React Navigation 5中导航到另一个导航器中的屏幕

颤振关闭子屏幕并自动导航到另一个屏幕

Swift UI 导航从初始屏幕自动延迟时间到另一个屏幕

导航到另一个屏幕时,undefined不是对象(评估“ this.props.navigation.navigate”)

使用提供程序将平面按钮从底部导航栏项目当前索引导航到另一个屏幕