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
相关产品推荐
相关产品推荐

