每次在Flutter中器械上显示屏面时更新数据

yh2wf1be  于 2023-03-19  发布在  Flutter
关注(0)|答案(1)|浏览(187)

我有一个flutter应用程序,具有redux状态管理功能。在我的应用程序中,当其他屏幕中的一些数据发生变化时,我想从服务器重新获取一些数据。但在我的应用程序中,我从屏幕1导航到屏幕2,并在屏幕2中更改了一些数据。我使用布尔标志needUpdate保存到redux,并在屏幕2中更改后设置为true。但当我导航回屏幕1时,我需要重新获取数据,如果标志是真的。但它没有工作,数据没有重新获取。
下面是一些代码:

class FirstScreen extends StatefulWidget {
  const FirstScreen({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  @override
  void initState() {
    super.initState();
  }

  @override
  void didChangeDependencies() async {
    final store = StoreProvider.of<AppState>(context);
    var needUpdate = store.state.commonState?.needUpdate.value ?? false;
    if (needUpdate) {
      await store.dispatch(prepareData(context));
    }
  }

  @override
  Widget build(BuildContext context) {}
}

class SecondScreen extends StatefulWidget {
  const SecondScreen({Key? key}) : super(key: key);

  @override
  State<SecondScreen> createState() => _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
  @override
  void initState() {
    super.initState();
  }

  void onPress() async {
    await store.dispatch(ChangeNeedUpdatePortfolio(true));
    Navigator.pop(context);
  }

  @override
  Widget build(BuildContext context) {}
}

下面是我的行动:

ThunkAction<AppState> updatePortfolioData(BuildContext context) {
  return (Store<AppState> store) async {
    bool needUpdate = store.state.commonState?.needUpdate.value ?? false;
    if (needUpdate) {
      ...
      await store.dispatch(ChangeNeedUpdatePortfolio(false));
      ...
      return;
    }
  };
}
t5fffqht

t5fffqht1#

您可以尝试使用StoreConnector的onInit属性在显示屏幕时加载初始数据,如下所示:

return StoreConnector<AppState, void>(
      onInit: (store) {
        var needUpdate = store.state.commonState?.needUpdate.value ?? false;
        if (needUpdate) {
          await store.dispatch(prepareData(context));
        }
      }
      builder: (BuildContext context, data) {
      },
    );

对于屏幕,你有两个选择。
选项1:使用PushReplacement在这两个屏幕之间导航。这将确保数据更新,因为每当屏幕更新时都会调用onInit。
选项2:当您从第二个屏幕返回时,从第一个屏幕调用函数。

return StoreConnector<AppState, void Function()>(
     converter: (store) { // This createds the function that you can call
        return () {
          var needUpdate = store.state.commonState?.needUpdate.value ?? false;
          if (needUpdate) {
            await store.dispatch(prepareData(context));
          }
        }
      },
      onInit: (store) {
        var needUpdate = store.state.commonState?.needUpdate.value ?? false;
        if (needUpdate) {
          await store.dispatch(prepareData(context));
        }
      }
      builder: (BuildContext context, updateData) {
         ...
         await Navigator.of(context)....
         updateData(); // Calls the function from your converter
         ...
      },
    );

相关问题