Dart/Flutter两页面间传值 StatefulWidget传参报错解决
错误原因
你把StatefulWidget的传参接收位置写反了。
按照Flutter的组件设计规则,路由跳转时的传入参数需要定义在继承StatefulWidget的组件类(即你的EditData类)中,State子类(即你的EditFire类)由框架自动通过createState方法创建实例,不支持自定义带参构造手动传值,State实例可以通过内置的widget属性访问到对应Widget实例上存储的所有参数。你现在把参数接收逻辑写在EditFire的构造函数里,框架调用createState时没法传入你要的5个参数,自然会报错。
修复方案
1. 修改editdata.dart代码
把参数定义和构造函数移到EditData类中,去掉EditFire的自定义带参构造,在initState生命周期里完成参数读取和初始化:
class EditData extends StatefulWidget { // 在这里声明所有需要接收的传参 final String ID; final String date; final String time; final String dest; final String src; const EditData({ super.key, required this.ID, required this.date, required this.time, required this.dest, required this.src, }); @override State<EditData> createState() => EditFire(); } class EditFire extends State<EditData> { late String currentID; final _destinationcontroller = TextEditingController(); final _sourcecontroller = TextEditingController(); late String olddate; late String oldtime; @override void initState() { super.initState(); // 通过widget属性读取传入的参数,完成初始化 currentID = widget.ID; olddate = widget.date; oldtime = widget.time; _destinationcontroller.text = widget.dest; _sourcecontroller.text = widget.src; } @override Widget build(BuildContext context) { // 原有页面构建逻辑不变 return Scaffold(); } @override void dispose() { // 释放文本控制器,避免内存泄漏 _destinationcontroller.dispose(); _sourcecontroller.dispose(); super.dispose(); } }
2. 修改readdata.dart中的跳转传参代码
不要直接实例化EditFire,跳转时实例化EditData传入参数即可,以Navigator路由跳转为例:
Navigator.push( context, MaterialPageRoute( builder: (context) => EditData( ID: "2", date: "17/6/2022", time: "2:25", dest: "NewYork", src: "Japan", ), ), );
注意事项
永远不要手动实例化State子类,State的生命周期由Flutter框架接管,所有页面间传递的参数都要挂载在Widget类上接收。
内容的提问来源于stack exchange,提问作者saad tabban
相关产品推荐
相关产品推荐

