提供程序中是否有属性明智的notifyListerners选项?

时间:2019-07-15 16:31:36

标签: flutter dart flutter-provider

我正在使用提供程序包进行状态管理的待办事项列表应用程序。在任务创建屏幕中,我有

之类的小部件。
  • 任务名称
  • 待办事项类型
  • 任务颜色选择器
  • 日期和时间
  • 保存按钮

任务模型

class Task with ChangeNotifier {
  String _name;
  String _type;
  Color _color;

  String get name => _name;

  set name(String name) {
   _name = name;
   notifyListeners();
  }


  Color get color => _color;

  set color(Color color) {
   _color = color;
   notifyListeners();
  }


  String get type => _type;

  set type(String type) {
   _type = type;
   notifyListeners();
  }

}

我正在这样使用ChangeNotificationprovider

ChangeNotifierProvider<Task>.value(
  value: Task(),
  child: Consumer<Task>(
    builder: (context, task, _) {
     return Scaffold(...
      ...
      NameWidget(),
      ColorWidget(),
      TypeWidget(),
      .....

因此,每个小部件都会更改Task模型的各个字段,但是我面临的问题是,只要小部件更新了任务模型的字段,Consumer下的所有小部件都会被更新,就像我每次更新{ {1}}字段应用程序不仅会刷新颜色字段,还会刷新所有其他字段。还有其他方法可以设计这种提供程序体系结构,例如仅向特定的字段侦听器发送通知吗?

这是我尝试过的。

我没有将color设为Task,而是尝试将每个字段创建为separte类和ChangeNotifier。例如,ChangeNotifier字段变成这样

name

但这似乎太多了样板代码。

1 个答案:

答案 0 :(得分:1)

这不是最优雅的解决方案,但是有效

首先创建一个类,该类接受扩展了changeNotifier的动态类型变量。

  T _value;

  NotifiedVariable(this._value);

  T get value => _value;

  set value(T value) {
    _value = value;
    notifyListeners();
  }
}

您现在可以将所有变量的类型设置为此

class c {
  NotifiedVariable<int> integer;
  NotifiedVariable<string> stringVal;

  c(int integer, string stringVal) {
    this.integer = NotifiedVariable<int>(integer);
    this.stringVal = NotifiedVariable<string>(stringVal);
  }
}

现在您可以注入此类,我使用get_it并在其他位置获取值。直接在需要的位置上方使用提供程序。如果需要多个值,这可能仍然不起作用。我建议创建另一个类,并从类c继承必要的值。

ChangeNotifierProvider<T>.value(
  value: locator.get<c>().integer,
  child: Consumer<T>(
    builder: (context, NotifiedVariable variable, child) => Widget(v: variable.value),
  ),
);

这是一种hack,所以我建议您研究更优雅的方法。