![](/img/trans.png)
[英]Flutter: setState() or markNeedsBuild() called during build
[英]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
,這不好。
您可以將fetchList
調用包裝在一個微任務中:
useEffect(() {
Future.microtask(() => model.fetchList());
}, []);
我知道這個問題很老了。 但我希望我的回答可以幫助別人。 我通過在下一幀中調用 function 解決了這個問題
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
model.fetchList();
}
}, []);
我個人使用useEffect()
以肘為單位進行初始化調用,如下所示:
final cubit = useCubit<BooksListCubit>();
final state = useCubitBuilder<BooksListCubit, BooksListPageState>(cubit);
useEffect(
() {
cubit.init();
return null;
},
[cubit],
);
在我廣泛的Flutter 肘部 + 鈎子 + Hive 教程中有更多相關信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.