flutterflutter-widgetflutter-hooks

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


Currently exploring functional_widgets and flutter_hooks. Having same idea with reactjs I'm fetching data with the following code.

@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),
    ),
  );
}

I don't think this is the right way since it's throwing an error.enter image description here


Solution

  • The issue with:

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

    is that fetchList is called synchronously inside build and modify an ancestor widget, which is not good.

    You can wrap the fetchList call in a microtask:

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