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

Flutter中如何调用StatefulWidget内自定义方法实现字符串拆分列表展示?

问题原因
  • Dart 类实例化时,成员变量的初始化要早于实例方法可访问阶段,你直接在定义wordlist时调用实例方法breakText不符合语法规则
  • State类的widget属性要在initState执行时才会和对应的StatefulWidget实例完成绑定,初始化成员变量时访问widget.text会抛出空引用异常
可行修改方案

推荐在initState生命周期中初始化wordlist,这是最符合Flutter开发规范的写法,initState会在widget绑定完成后、build执行前触发,完全满足初始化需求。你也可以同步优化字符串拆分的空串过滤逻辑,无需循环移除空值。

修改后可直接运行的完整代码如下:

class SecondRoute extends StatefulWidget {
  final String text;
  SecondRoute({Key? key, required this.text}) : super(key: key);

  @override
  _SecondRouteState createState() => _SecondRouteState();
}

class _SecondRouteState extends State<SecondRoute> {
  late List wordlist;

  List breakText(){
    String newT = widget.text;
    // 优化空串过滤逻辑,自动过滤空格、纯空白字符的拆分结果
    return newT.split(" ").where((str) => str.trim().isNotEmpty).toList();
  }

  @override
  void initState() {
    super.initState();
    // initState阶段widget已完成绑定,可安全访问
    wordlist = breakText();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Second Route"),
      ),
      // 用列表展示拆分后的所有单词
      body: ListView.builder(
        itemCount: wordlist.length,
        itemBuilder: (context, index) {
          return Padding(
            padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
            child: Text(
              wordlist[index],
              style: const TextStyle(fontSize: 24),
            ),
          );
        },
      ),
    );
  }
}

如果不想单独写initState逻辑,也可以用late关键字修饰wordlist实现延迟初始化,Dart会在第一次访问这个变量的时候才执行初始化逻辑,只要首次访问发生在widget绑定之后就不会报错,写法如下:

// 直接在定义处赋值,配合late延迟执行初始化逻辑
late List wordlist = breakText();

内容的提问来源于stack exchange,提问作者masfiq reza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:36:04