Flutter父组件向Stateful子Widget传递int参数失败问题排查
问题原因
ScrollablePositionedListPage类的构造函数未将传入参数赋值给类成员变量:代码中虽然定义了late int neducem字段,也在构造函数入参中声明了required int neducem,但二者未建立绑定关系,传入的参数值未存储到类的neducem字段中,访问未初始化的late字段会直接抛出异常。
此外,Flutter官方要求StatefulWidget的所有实例字段必须不可变,使用late修饰可变字段本身也不符合开发规范。
解决方案
- 修改构造函数的参数绑定逻辑,直接将入参赋值给类成员变量,无需额外声明独立的入参变量
- 将
neducem字段的修饰符从late int改为final int,符合Widget不可变的规范 - 可选优化:在State子类中访问传入参数时,推荐通过
widget.neducem的形式读取,尽量避免在createState方法中直接访问Widget字段,该写法更符合State生命周期规范
修正后完整代码
// 父组件逻辑无需调整 print("here we have ${widget.which}"); // 正常输出 here we have 1 return Scaffold( body: ScrollablePositionedListPage(neducem: widget.which) ); // 修正后的子组件代码 class ScrollablePositionedListPage extends StatefulWidget { // 使用final修饰,符合Widget不可变规范 final int neducem; // 构造函数直接绑定this.neducem,自动完成参数赋值 ScrollablePositionedListPage({required this.neducem}); @override ScrollablePositionedListPageState createState() { print("and here we have $neducem"); // 现在可正常打印传入的参数值 return ScrollablePositionedListPageState(); } } // State子类中访问参数的推荐写法 class ScrollablePositionedListPageState extends State<ScrollablePositionedListPage> { @override void initState() { super.initState(); // 通过widget实例访问父组件传入的参数,是官方推荐的标准用法 print("access param in State: ${widget.neducem}"); } }
内容的提问来源于stack exchange,提问作者Eight Rice
相关产品推荐
相关产品推荐

