我有一个下拉菜单,我可以选择几个项目。我使用StateNotifier,因为对于简单的StateProvider来说,逻辑有点太复杂了。我有一个模型类,我想填充属性,例如。
Class ReportError {
Name;
Code;
Png;
...
}
字符串
我的问题是:
@override
Widget build(BuildContext context) {
final selectedValue = ref.watch(fillErrorModelProvider).selectedTool; //here I watch at my state, here I think is my problem
return Stack(
children: [
Align(
//..Here is my drop-down on changed
onChanged: (value) {
ref.read(fillErrorModelProvider.notifier).setToolName(value!);
print(selectedValue); // and this is always one behind. So when I select cat, it says null, then I change to dog, it says cat.
},
),
//...
],
);
}
型
我做错了什么?根据文档,我认为我必须直接在build方法下执行此Variable =ref.watch(provider)。当我直接将print语句更改为ref.watch时,一切正常。我的provider内容:
final fillErrorModelProvider = StateNotifierProvider<FillReportBugModelNotifier, ReportBugModel>((ref) {
return FillReportBugModelNotifier();
});
class FillReportBugModelNotifier extends StateNotifier<ReportBugModel> {
FillReportBugModelNotifier() : super(ReportBugModel());
void setToolName(String selectedTool) {
state = ReportBugModel().copyWith(selectedTool: selectedTool);
}
}
型
2条答案
按热度按时间vof42yt11#
这是所发生事情的时间轴:
1.在第一次构建小部件时,调用了
build
方法。selectedValue
的值现在是null
。onChanged
回调函数还没有被调用。1.用户选择一个可选项目,调用
onChanged
回调,执行2行:1)调用setToolValue
的那个,(我假设)将通知程序状态修改为value
(也就是 cat),以及2)打印当前selectedValue
的那个。(这是第1步中提到的第一个构建),并且还没有发生其他构建调用,因此selectedValue
的值为null
。1.由于在上一步中,notifier值被更改为 cat,因此小部件将通过再次调用
build
方法进行重建。这是因为您通过在build
方法中调用ref.watch
来监视提供程序。现在selectedValue
的值为 cat。1.当用户再次选择一个新的项目时,选择项目 dog,现在调用
onChanged
回调。与步骤2中相同的事情发生,其中通知程序状态更改为 dog,并打印当前持有 cat 值的selectedValue
。1.由于在上一步中通知程序的状态发生了变化,
build
方法被再次调用。现在selectedValue
的值是 dog。bqjvbblv2#
FYI:Idk发生了什么事,但它的工作现在经过一个晚上.也许晚上修复了问题:D但这种方法必须是正确的,所以idk什么是错的,我没有改变代码.