Flutter Provider - ChangeNotifierProxyProvider 设置依赖

cos*_*nus 6 dart flutter

我在设置与 Provider 包的依赖关系时遇到问题和困境。
我的代码:

providers: [
        ChangeNotifierProvider<AuthModel>(          
            builder: (context) => AuthModel(userRepository: UserRepository())),
        ChangeNotifierProxyProvider<AuthModel, AppModel>(
          initialBuilder: (_) => AppModel(),
          builder: (_, auth, app) => app..authModel = auth,
        ),
    ],
Run Code Online (Sandbox Code Playgroud)

使用ChangeNotifierProxyProvider, authModel 上的更改使构建器ChangeNotifierProxyProvider每次都运行。AuthModel 是一个 ChangeNotifier 设置一次,因为依赖就足够了。

问题:

  1. 在每个代码重建(提供者设置在构建方法上)执行

    ChangeNotifierProvider<AuthModel>(          
            builder: (context) => AuthModel(userRepository: UserRepository()))
    
    Run Code Online (Sandbox Code Playgroud)

重新创建 AuthModel 实例?

  1. 在 AuthModel 上的每次更改中

    ChangeNotifierProxyProvider<AuthModel, AppModel>(
              initialBuilder: (_) => AppModel(),
              builder: (_, auth, app) => app..authModel = auth,
            ),
    
    Run Code Online (Sandbox Code Playgroud)

builder 再分配?AuthModel 是一个 ChangeNotifier,没有重新分配的意义。

  1. 每次重建时,ChangeNotifierProxyProviderbuilder 都会再次运行?

Rém*_*let 13

的默认构造函数ChangeNotiferProvider将调用builder 一次且仅一次

ChangeNotiferProxyProvider另一方面,builder每次更新其依赖项时都会再次调用。

但它完全没问题。有builder被再次调用并不意味着家属必须要更新。仅当builder调用notifyListeners通知程序时才执行更新。

这意味着您的通知程序可以像这样过滤更新:

class MyNotifier with Notifier {
  A _a;
  A get a => _a;
  set a(A value) {
    // don't unnecessarily call `notifyListeners` if nothing changed
    if (value != _a) {
      _a = value;
      notifyListeners();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)