【问题标题】:Provider to a different page not working as excpected不同页面的提供程序未按预期工作
【发布时间】:2021-04-23 16:31:54
【问题描述】:

我是一名新的颤振开发人员,我在通过上下文传递提供者时遇到了问题。 如果我理解正确,可以使用以下方式通过上下文传递提供程序: Provider.of<DataModel>(context);

错误是:“在此 PageMain Widget 上方找不到正确的 Provider”

我正在使用我的小部件树顶部的 ChangeNotifierProvider,因此任何小部件都可以访问 DataModel 类,目的是使其成为一种充当主题的单例。

            return ChangeNotifierProvider<DataModel>(
              create: (context) => DataModel(),
              builder: (context, dataModel){
                  return PageSplash();
              }

然后,我在 PageSplash(); 中有这个函数; 在对用户进行身份验证后调用它。 在其中,我将上下文与用户的详细信息一起传递。

  void _showNextPage(User user) {
    PageShower.replaceWithMainPage(context, user, AppData.instance.user);
  }

replaceWithMainPage 是一个 util 函数,写法如下:

static void replaceWithMainPage(BuildContext context, User user, RMUser receetMeUser) {
    if (Platform.isAndroid) {
      Navigator.of(context).pushReplacement(
        MaterialPageRoute(
          builder: (context) => PageMain(
            firebaseUser: user,
            receetMeUser: receetMeUser,
          ),
        ),
      );
    } else {
      Navigator.of(context).pushReplacement(
        CupertinoPageRoute(
          builder: (context) => PageMain(
            firebaseUser: user,
            receetMeUser: receetMeUser,
          ),
        ),
      );
    }
  }

我正在尝试访问我在页面启动画面中注入的提供程序,如下所示: Provider.of&lt;DataModel&gt;(context);

数据模型代码:

import 'package:flutter/material.dart';

class DataModel with ChangeNotifier{
  bool _isLoading = true;
  bool _isSearching = true;

  String _version = "";
  String _buildNumber = "";

  set buildNumber(String value){
    _buildNumber = value;
    notifyListeners();
  }

  get buildNumber => _buildNumber;

  set version(String value){
    _version = value;
    notifyListeners();
  }

  get version => _version;

  set isLoading(bool value){
    _isLoading = value;
    notifyListeners();
  }

  get isLoading => _isLoading;

  set isSearching(bool value){
    _isSearching = value;
    notifyListeners();
  }

  get isSearching => _isSearching;

}

【问题讨论】:

  • 发布您的DataModel 内容
  • @dm_tr 据我了解,我可以使用 Builder 方法,而不是将那部分代码分离到不同的独立小部件树,以便它为我提供父级的上下文,这应该导致完全相同的行为。

标签: flutter dart


【解决方案1】:

我对提供者采取不同的方法。我总是在 main 方法中的应用程序之前放置一个多提供程序代码块。请参阅下面的主要内容,并告诉我它是否适合您。它非常适合我。我已在多提供者代码块中添加了您的 DataModel。

void main() {
  runApp(
    MultiProvider(providers: [
      BlocProvider<EditPlusTableBloc>(
        create: (_) => EditPlusTableBloc(),
      ),
      BlocProvider<DataModel>(
        create: (_) => DataModel(),
      ),
    ],
    child : ExampleApp()
    )
  );
}

【讨论】:

    【解决方案2】:

    Flutter 不会将这两条路径识别为相同的,因为它们的大小写不同。修复您的导入,以便它们引用相同的文件。

    【讨论】:

    • 我不太明白你的意思。您是说 DataModel 类不包含在同名文件中?
    • 是的。修复您的导入。例如:这个导入'models/DataModel.dart'和这个导入'Models/DataModel.dart'是不同的。其中之一将不起作用。
    猜你喜欢
    • 2016-04-15
    • 2018-03-21
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多