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();
}
}, []);
目前正在探索 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();
}
}, []);