You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter报错:实例成员无法在初始化器中访问,求解决方案

解决Flutter中"The instance member 'items' can't be accessed in an initializer"错误

错误原因

  1. 你将question作为类成员变量直接初始化,Dart不允许在类成员的初始化器中访问其他实例成员(比如items)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:10:29