【问题标题】:Flutter provider values reset after closing the dialog关闭对话框后重置 Flutter 提供程序值
【发布时间】:2021-01-01 05:42:14
【问题描述】:

我创建了一个 ChangeNotifier 并将其添加到 main.dart 提供程序列表中,如下所示:

ChangeNotifierProvider<AppState>(
    create: (context) => AppState(),
);

我有一个对话框,我用ChangeNotifierProvider.value 包装了一个对话框,以便访问对话框内的提供程序,如下所示:

showDialog(
    context: context,
    builder: (BuildContext context) {
      return ChangeNotifierProvider.value(
        value: AppState(),
        child: LanguageDialog(),
      );
    });
});

但问题是,当我在对话框内的提供程序状态中设置一些数据时,只要我在对话框内,它就可以正常工作!当我关闭对话框时,状态会重置!我不知道为什么会这样。 我也尝试在另一个路由中设置一些状态,结果是该路由中的状态数据与对话框不同。

我在这里做错了什么?

【问题讨论】:

    标签: flutter dart provider


    【解决方案1】:

    ChangeNotifierProvider.value 创建一个新的 AppState 实例并传递给您的对话框。它与您的全局 AppState 实例不同。您可以在对话框中使用 Provider.of 函数访问 Provider,而不是为您的对话框创建新的提供程序。

    var appState = Provider.of<AppState>(context);
    

    您可以访问LanguageDialog 中的提供程序,也可以通过如下参数传递它:

    showDialog(
        context: context,
        builder: (BuildContext context) {
          return LanguageDialog(
            appState: Provider.of<AppState>(context);
          );
        }),
    });
    

    【讨论】:

    • 感谢您的回答但是我尝试在对话框中使用Provider.of,但我总是收到错误消息,它无法在此小部件上方找到提供程序,我还尝试了您的第二个解决方案以通过小部件的提供程序实例并且它工作但存在一个问题是小部件内部的数据没有更新,我该怎么办?
    • @Komeyl94 您的提供程序模型可能存在问题。
    【解决方案2】:

    这里的问题是提供程序的范围是相同的路由,并且由于您正在通过对话框导航到新路由,因此当您退出该对话框时,提供程序不会存储该值。

    确保在 MaterialApp 之上创建您的提供程序,以便提供程序的范围适用于整个应用程序。您可以像这样指定它:-

    ChangeNotifierProvider<AppState>(
        create: (context) => AppState(),
        child: MaterialApp(
           home: HomeScreen())
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多