【问题标题】:Flutter state management issueFlutter 状态管理问题
【发布时间】:2019-11-23 08:52:25
【问题描述】:

我的问题与提供者模式/库有关。

我创建了一些状态类如下(我替换了内容/变量名称以保持简单)

class State1 with ChangeNotifier{

String _s;

  set s(String newS){
    _s = newS;
    notifyListeners();
  }

}

然后我使用 multiprovider 传递它(在小部件 init 中创建对象,该对象充当应用程序中所有内容的父级。)

child: MultiProvider(
        providers: [
          ChangeNotifierProvider(builder: (context) => state1),
        ],
        child: Stack(
        alignment: Alignment.center,
        children: stackChildren,
      ),

然后使用

在子小部件构建方法中访问它
 state1Var = Provider.of<State1>(context);

所有这一切都很好..

我的问题是当我开始使用导航推送时,我无法再访问该状态。

onPressed: (() {
          Navigator.push(
            contextField,
            MaterialPageRoute(builder: (context) => NewPage()),
          );
        }),

当我得到这个错误

Could not find the correct Provider<State1> above this NewPage Widget...

我确实设法使用它来获得它

  Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Consumer(builder: (),child: NewPage(),)),
          );

但是当我使用 navigator.pop() 弹出小部件时,无法使用状态,因为它说它已被处理。我做错了还是我错过了什么?

对不起,如果我让这变得复杂了。我不得不删除很多代码。

感谢您的帮助:)

【问题讨论】:

    标签: firebase flutter bloc flutter-provider


    【解决方案1】:

    您可能遇到context hierarchy 问题。使用 MultiProvider 包裹您的 MaterialApp,或者您的 Provider 必须位于您正在获取提供程序的 Route 之上。

    否则,您可以使用 Consumer 小部件包裹您的 Scaffold。 Consumer 所做的是,它只是一个构建器,用于通过创建另一个context 在您的ProviderRoute 之间建立连接,并让您通过InheritedWidget 获取Provider 类。

    【讨论】:

    • 啊,我没有用多提供商包装材料应用程序......非常感谢你,伙计:D
    • @ebg11 如果您的问题得到解决,请不要忘记通过接受正确答案来结束您的主题:stackoverflow.com/help/someone-answers
    • 如果您不介意回答,我还有另一个问题。我想在 init() 中设置一个编辑文本控制器值,以具有位于其中一个提供程序中的内容。在构建中设置它意味着他们永远无法更改它,因为它会立即返回到状态中的内容(这样做是因为我不想在他们输入内容时总是更新状态)。我一直在使用这个 AfterLayoutMixin (pub.dev/packages/after_layout) 作为解决方案(提供了一种在构建后调用的方法来覆盖)。有没有官方的方法可以做到这一点,或者这个库是一个好方法。
    • @ebg11 我不明白你到底想要什么。由于这完全是另一个问题,您可以使用一些代码和更好的解释打开另一个问题。如果你愿意,请在评论中标记我,以便我收到通知。
    • 好的,我会的。我刚刚写了这个问题,但我不能再发布 60 分钟。同样对于通知,我只是这样做@Esen Mehmet。感谢您的所有帮助
    猜你喜欢
    • 2021-12-19
    • 2021-08-20
    • 2021-04-11
    • 2021-03-04
    • 2021-04-07
    • 2021-05-03
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多