2

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

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

任务模型

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(),
      .....

因此,每个小部件都将更改任务模型的各个字段,但我面临的问题是,每当小部件更新任务模型的字段时,所有小部件Consumer都在更新,就像每当我更新color字段时,应用程序将刷新不是唯一的颜色字段但所有其他领域。是否有任何其他方式来设计此提供程序架构,例如仅向特定字段侦听器发送通知?

这是我尝试过的。

我没有尝试将每个字段创建为单独的类和TaskChangeNotifier 。ChangeNotifier比如name字段变成这样

class Task {
     Name _name;
}
class Name with ChangeNotifier {
     String _name;
}

但这似乎是太多的样板代码。

4

1 回答 1

1

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

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

class NotifiedVariable<T> with 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,所以我建议寻找更优雅的方法。

于 2019-07-17T13:01:04.177 回答