dart Flutter Riverpod总是落后/延迟一个状态

rqqzpn5f  于 9个月前  发布在  Flutter
关注(0)|答案(2)|浏览(89)

我有一个下拉菜单,我可以选择几个项目。我使用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);
  }
}

vof42yt1

vof42yt11#

这是所发生事情的时间轴:
1.在第一次构建小部件时,调用了build方法。selectedValue的值现在是nullonChanged回调函数还没有被调用。
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

bqjvbblv

bqjvbblv2#

FYI:Idk发生了什么事,但它的工作现在经过一个晚上.也许晚上修复了问题:D但这种方法必须是正确的,所以idk什么是错的,我没有改变代码.

相关问题