Flutter报错:实例成员无法在初始化器中访问,求解决方案
解决Flutter中"The instance member 'items' can't be accessed in an initializer"错误
错误原因
- 你将
question作为类成员变量直接初始化,Dart不允许在类成员的初始化器中访问其他实例成员(比如items) items是通过异步方法readJson加载的,初始化question时items还是空数组,直接访问items[0]不仅会触发初始化器错误,后续还可能导致空指针异常
修复方案
方案1:在build方法内构建目标Widget
把question的构建逻辑移到build方法中,这样每次setState更新items后,Widget会重新构建并使用最新数据:
class YourPage extends StatefulWidget { @override _YourPageState createState() => _YourPageState(); } class _YourPageState extends State<YourPage> { var items = []; @override void initState() { super.initState(); readJson(); } Future<void> readJson() async { final String response = await rootBundle.loadString('assets/questions.json'); final data = json.decode(response); setState(() { items = data["Questions"]; }); } @override Widget build(BuildContext context) { // 处理数据未加载完成的情况 if (items.isEmpty) { return const Center(child: CircularProgressIndicator()); } return Scaffold( body: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Container( margin: const EdgeInsets.only(left: 20.0, right: 20.0, top: 40, bottom: 30), alignment: Alignment.centerLeft, child: const Text( "Question 1:", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: Colors.white), ), ), Container( alignment: Alignment.center, margin: const EdgeInsets.only(bottom: 80), child: Text( items[0]["description"], style: TextStyle(fontWeight: FontWeight.w500, fontSize: 30, color: Colors.white), ), ) ], ), ); } }
方案2:将question改为返回Widget的方法
如果需要复用这个Widget逻辑,可以封装成方法,确保每次调用时都能访问到最新的items:
class _YourPageState extends State<YourPage> { var items = []; // 初始化和readJson方法保持不变 @override void initState() { super.initState(); readJson(); } Future<void> readJson() async { final String response = await rootBundle.loadString('assets/questions.json'); final data = json.decode(response); setState(() { items = data["Questions"]; }); } Widget buildQuestionWidget() { if (items.isEmpty) { return const Center(child: CircularProgressIndicator()); } return Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Container( margin: const EdgeInsets.only(left: 20.0, right: 20.0, top: 40, bottom: 30), alignment: Alignment.centerLeft, child: const Text( "Question 1:", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: Colors.white), ), ), Container( alignment: Alignment.center, margin: const EdgeInsets.only(bottom: 80), child: Text( items[0]["description"], style: TextStyle(fontWeight: FontWeight.w500, fontSize: 30, color: Colors.white), ), ) ], ); } @override Widget build(BuildContext context) { return Scaffold(body: buildQuestionWidget()); } }
关键注意点
- 不要在类成员初始化器中访问其他实例变量,这类操作应放在
build方法、initState(仅同步操作)或Widget构建方法中 - 异步加载数据时,必须处理数据未就绪的状态(比如显示加载指示器),避免数组越界或空指针异常
内容的提问来源于stack exchange,提问作者Mohamed Bigi
相关产品推荐
相关产品推荐

