有状态小部件消费者小部件构建两次,因此调用 initState 两次。如何阻止这种情况发生?

cod*_*hay 6 rebuild stateful dart flutter riverpod

因此,对于我的项目,我正在使用 Riverpod,并且正在创建应用程序的主页。这棵树看起来像这样 ->

CommunityView(Stateful Widget)
WillPopScope
ProviderScope
Consumer
Scaffold
...and so on
Run Code Online (Sandbox Code Playgroud)

现在在 CommunityView Widget 的 build 方法中,

 final params = _VSControllerParams(
      selectedFamily: widget.selectedFamily,
    );
    print('familiesStatus: rebuild main');

    return WillPopScope(
      onWillPop: onWillPop,
      child: ProviderScope(
        overrides: [_paramsProvider.overrideWithValue(params)],
        child: Consumer(
          builder: (context, watch, child) {
            print('familiesStatus: rebuild consumer');
            final state = watch(_vsProvider(params));
            final stateController = watch(_vsProvider(params).notifier);
Run Code Online (Sandbox Code Playgroud)

打印rebuild main只发生一次,而rebuild consumer打印发生两次。以前的主页获取数据,然后根据网络响应显示获取的数据或错误。现在我使用枚举来获取加载状态,即 ApiStatus.loading 是初始状态,然后 ApiStatus.success 或失败取决于响应。现在,我所做的导致此问题的更改是 -> 我在 initstate 中添加了一个函数调用,用于获取本地保存的缓存并从中加载数据。所以发生的事情是 ApiStatus.loading->ApiStatus.success(已获取缓存)->ApiStatus.loading(以某种方式重建整个小部件)->ApiStatus.success(再次获取缓存)->ApiStatus.success(从互联网获取数据)。所以我不确定为什么在获取缓存时第一次重建。

现在为了解决这个问题,我首先尝试在缓存方法调用中查找导致此重建的任何原因,但即使进行大量调试也无法找到任何原因。然后我想创建一个全局参数,如下所示

bool fetchDataFromCache = true;
Run Code Online (Sandbox Code Playgroud)

然后在 initState 内部,我调用 fetch Cache 方法,如下所示

if(fetchDataFromCache){
    fetchCache();
    fetchDataFromCache = false;
}
Run Code Online (Sandbox Code Playgroud)

但这导致 ApiStatus 加载参数像这样更改 ->ApiStatus.loading(初始构建)->ApiStatus.success(已获取缓存)->ApiStatus.loading(不知何故整个小部件重建)->ApiStatus.success(从互联网获取的数据) )。所以小部件仍在重建,因为我只在 initState 中设置了 ApiStatus.loading,而没有在其他地方设置。所以还是出问题了。

演示视频 - https://youtu.be/1EzYfCRiwk0