【问题标题】:ChangeNotifierProxyProvider not initiated on buildChangeNotifierProxyProvider 未在构建时启动
【发布时间】:2021-06-24 02:38:54
【问题描述】:

我正在尝试了解 Flutter 中的多提供者。在我的 App 中,一个 Provider 需要根据另一个 Provider 的值进行更改。

AuthProvider 在构建时会在小部件树的较高位置启动。如果可能的话,它就像一个带有自动登录的魅力......

在较低位置的小部件中,我尝试启动另外两个提供程序。一,WhatEver,不依赖于其他数据,并在构建时启动,就像它应该使用 ChangeNotifierProvider 一样。

ProductList 然而依赖于 AuthProvider。如果登录状态发生变化,则产品列表应相应更新。

在我的尝试中,我发现,即在 SO 上发现,ChangeNotifierProxyProvider 是正确的方法。但是当我运行应用程序时,似乎在构建小部件时没有启动 ChangeNotifierProxyProvider 的“创建”部分。似乎 ProductList 提供程序在被读取或写入之前不会启动。

我对使用 MultiProviders 和 ChangeNotifierProxyProvider 有什么误解?

return MultiProvider(
        providers: [              
          ChangeNotifierProvider<WhatEver>(create: (context) => WhatEver()),
          ChangeNotifierProxyProvider<AuthProvider, ProductList>(
            create: (_) => ProductList(Provider.of<AuthProvider>(context, listen: false)),
            update: (_, auth, productList) => productList..reloadList(auth)
          ),
        ],

ProductList 如下所示:

final AuthProvider _authProvider;

static const String _TAG = "Shop - product_list.dart : ";

ProductList(this._authProvider) {
    print(_TAG + "ProductList Provider initiated");
    reloadList(this._authProvider);
}

void reloadList(AuthProvider authProvider) {
    print(_TAG + "ProductList reload started");
    if (authProvider.user==null) {
        print(_TAG + "ProductList: _authProvider == null");
        _loadBuiltInList();
    } else {
        print(_TAG + "ProductList: user = " + authProvider.user.displayName);
        _loadFirestoreList();
    }
}

【问题讨论】:

  • 可以是lazy 吗? See this answer
  • 女士认为是正确的。虽然打开了其他问题????

标签: flutter dart flutter-provider flutter-change-notifier


【解决方案1】:

我有这样的代码:

ChangeNotifierProxyProvider<AuthService, ProfileService>(
  create: (ctx) => ProfileService(),
  update: (ctx, authService, profileService) =>
      profileService..updateAuth(authService),
),

My ProfileService() 不依赖 AuthService 在构造时可用。代码运行良好:)

ChangeNotifierProxyProvider documentation 明确描述了这种方法:

请注意 MyChangeNotifier 如何在其构造函数中未接收 MyModel 了。它现在改为通过自定义设置器/方法传递。

【讨论】:

  • Eduardos 指向另一个答案的链接是正确的。 ChangeNotifierProxyProvider 是懒惰的。如果惰性设置为 false,它会在构建时启动。
猜你喜欢
  • 2020-07-22
  • 2018-02-11
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2017-08-03
  • 1970-01-01
  • 2014-09-11
相关资源
最近更新 更多