我正在使用提供程序包进行状态管理的待办事项列表应用程序。在任务创建屏幕中,我有
之类的小部件。任务模型
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
但这似乎太多了样板代码。
答案 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,所以我建议您研究更优雅的方法。