Flutter中initState调用的readJson方法不执行 重启IDE后功能失效
问题根因
你的readJson方法实际已经执行,只是出现了两个典型的异步渲染问题:
- 异步方法执行完毕后没有调用
setState通知框架刷新UI,冷启动时build方法先于异步回调执行,此时onboardingTasks为空,PageView渲染0个页面,你就会误以为方法没有执行。 - 热重载会触发页面强制重绘,此时异步加载已经完成,数据已经存在于
onboardingTasks中,所以表现为热重载功能正常。
修复步骤
1. 异步加载完成后触发UI刷新
修改readJson方法,数据赋值后调用setState,建议同时增加异常捕获排查资源路径、JSON解析类错误:
Future<void> readJson() async { try { response = await rootBundle.loadString('assets/cfg/onboarding_tasks.json'); final onboardingTodo = onboardingTodoFromJson(response); setState(() { onboardingTasks.addAll(onboardingTodo.values); }); print("onboarding length - ${onboardingTasks.length}"); } catch (e) { print("加载JSON出错: $e"); } }
2. 增加加载占位状态
冷启动加载阶段显示加载指示器,避免空页面误导你判断逻辑执行状态:
@override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: onboardingTasks.isEmpty ? const Center(child: CircularProgressIndicator()) : Stack( // 原有Stack逻辑保持不变 ), ), ); }
可选优化
你当前定义的全局bool value会导致所有复选框联动,勾选任意一个所有复选框都会同步状态,建议把选中状态存储到OnboardingTask实体类中,或者单独声明List<List<bool>> taskCheckStates存储每个复选框的选中状态。
内容的提问来源于stack exchange,提问作者Vivian Lobo
相关产品推荐
相关产品推荐

