Flutter中StatefulWidget间变量传递失败问题求助
解决Flutter StatefulWidget构造函数传值为空的问题
我来帮你拆解下问题根源,再一步步给出修复方案:
一、Approval类的错误修复
你给_ApprovalState手动加构造参数的做法不符合Flutter的设计逻辑,State类是依附于对应的StatefulWidget实例存在的,正确的姿势是通过widget.xxx来访问StatefulWidget里的成员变量,而不是手动给State传参。
问题出在哪?
你手动给_ApprovalState传递pickedDay、timePicked、userPhone,不仅会导致后续widget重建时State内的变量无法同步更新,更关键的是这种方式很容易出现参数传递错位,最终导致userPhone为空。
修复后的代码:
class Approval extends StatefulWidget { final String timePicked; final DateTime pickedDay; final String userPhone; // 构造函数保持原有传参逻辑即可 Approval({Key key, @required DateTime picked, @required String timePicked, @required String phoneNumber}) : pickedDay = picked, timePicked = timePicked, userPhone = phoneNumber, super(key: key); // 创建State时不需要传任何参数! _ApprovalState createState() => _ApprovalState(); } class _ApprovalState extends State<Approval> { DatabaseReference itemRef = FirebaseDatabase.instance.reference().child('customers'); @override Widget build(BuildContext context) { // 直接通过widget.userPhone获取传递过来的值 print('拿到的手机号:${widget.userPhone}'); return // 你的UI代码; } }
同时要确保你实例化Approval时,正确传入了phoneNumber参数:
// 在signInWithCredential获取到phoneUser之后的跳转逻辑里 Navigator.push( context, MaterialPageRoute( builder: (context) => Approval( picked: // 你的选中日期变量, timePicked: // 你的选中时间变量, phoneNumber: phoneUser, // 这里必须传入正确的phoneUser值 ), ), );
二、Amenities类的问题排查
你说Text(widget.phoneNumber)为空,大概率是实例化Amenities时没有传入phoneNumber参数,或者传入的是null值。
修复步骤:
- 确保实例化时传参正确:
Navigator.push( context, MaterialPageRoute( builder: (context) => Amenities( phoneNumber: phoneUser, // 这里必须传入获取到的phoneUser变量 ), ), );
- 建议给参数加上
@required注解,强制调用时传参,避免遗漏:
class Amenities extends StatefulWidget { final String phoneNumber; // 加@required避免忘记传参 Amenities({Key key, @required this.phoneNumber}):super(key: key); AmenitiesState createState() => AmenitiesState(); } class AmenitiesState extends State<Amenities> { @override Widget build(BuildContext context) { // 可以加个空值兜底,避免UI报错 return Text(widget.phoneNumber ?? '未获取到手机号'); } }
额外检查点
- 先确认
signInWithCredential里的phoneUser本身不为空:
final String phoneUser = currentUser.phoneNumber; print('获取到的用户手机号:$phoneUser'); // 先打印确认这个值不是null
如果这里就是null,那要先排查Firebase用户的phoneNumber是否正确获取,可能是认证流程中没有正确获取到用户的手机号信息。
内容的提问来源于stack exchange,提问作者Василий Гринько
相关产品推荐
相关产品推荐

