Flutter Hooks 使用 useEffect 获取数据 - 在构建期间调用 setState() 或 markNeedsBuild()

Flutter Hooks Fetching Data using useEffect - setState() or markNeedsBuild() called during build

目前正在探索 functional_widgets 和 flutter_hooks。与 reactjs 有相同的想法,我正在使用以下代码获取数据。

@hwidget
Widget homeScreen(BuildContext context) {
  TodoListProvider model = Provider.of<TodoListProvider>(context);
  useEffect(() {
    print('effect');
    model.fetchList();
    return () => {};
  }, []);
  return Scaffold(
    appBar: _buildAppbar(context, model),
    bottomNavigationBar: _buildBottomNav(context, model),
    floatingActionButton: _buildFloatingAction(context),
    body: PageTransitionSwitcher(
      duration: const Duration(milliseconds: 300),
      reverse: model.reverse,
      transitionBuilder: (
        Widget child,
        Animation<double> animation,
        Animation<double> secondaryAnimation,
      ) {
        return SharedAxisTransition(
          child: child,
          animation: animation,
          secondaryAnimation: secondaryAnimation,
          transitionType: SharedAxisTransitionType.horizontal,
        );
      },
      child: _getCurrentTab(model.currentIndex),
    ),
  );
}

我认为这不是正确的方法,因为它会引发错误。

问题:

  useEffect(() {
    model.fetchList();
  }, []);

就是fetchList是在构建和修改一个祖先widget里面同步调用的,不好

您可以将 fetchList 调用包装在微任务中:

  useEffect(() {
    Future.microtask(() => model.fetchList());
  }, []);

我知道这个问题很老了。但我希望我的回答可以帮助别人。我通过在下一帧进行函数调用解决了这个问题

useEffect(() {
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      model.fetchList();
    }
}, []);