Flutter报错:无法在初始化器中访问实例成员widget的问题求助
Flutter页面传参后获取数据报错问题
问题场景
从Firestore获取随机用户ID并传递到ChatScreen页面,接收页面获取参数时出现错误。
传参代码
TextButton( onPressed: () async { final QuerySnapshot result = await FirebaseFirestore.instance.collection('ActiveUsers').get(); final List<DocumentSnapshot> documents = result.docs; var data = (documents..shuffle()); await Navigator.of(context) .push(MaterialPageRoute(builder: (context) => ChatScreen(receiverId: data.first.id))); }, )
接收参数代码
class ChatScreen extends StatefulWidget { final String receiverId; const ChatScreen({Key key, @required this.receiverId}) : super(key: key,); @override State<ChatScreen> createState() => _ChatScreenState(); } class _ChatScreenState extends State<ChatScreen> { bool isDarkTheme = false; String id = widget.receiverId; }
报错信息(中文翻译)
无法在初始化器中访问实例成员‘widget’。尝试用其他表达式替换对实例成员的引用。
数据库结构

尝试通过initState赋值时,虽能在initState中访问widget.receiverId,但赋值操作仍报错。
解决方法
原因分析
在State类的成员变量初始化阶段,widget实例还未完成初始化,因此无法直接在成员变量声明时通过widget.receiverId赋值。
正确实现方式
方式1:在initState中初始化
class _ChatScreenState extends State<ChatScreen> { bool isDarkTheme = false; String id; @override void initState() { super.initState(); id = widget.receiverId; // 此处可安全访问widget } }
方式2:使用late关键字延迟初始化
若确定receiverId不会为null,可通过late关键字延迟变量初始化:
class _ChatScreenState extends State<ChatScreen> { bool isDarkTheme = false; late String id = widget.receiverId; }
方式3:直接使用widget.receiverId
若无需额外存储变量,可在需要使用的场景直接调用widget.receiverId:
@override Widget build(BuildContext context) { return Text(widget.receiverId); }
内容的提问来源于stack exchange,提问作者Anurag Yadav
相关产品推荐
相关产品推荐

