Flutter:TextEditingController初始化访问widget成员报错解决方法
解决Flutter中TextEditingController初始化访问widget报错的问题
这个问题我之前也碰到过,报错的原因很清晰:在State类的成员变量初始化阶段,widget对象还没有完成初始化绑定,所以你没法直接在声明TextEditingController的时候访问widget.nrpUpdate。下面给你两种靠谱的修复方案:
方案一:在initState中初始化控制器(推荐)
initState是State类生命周期中第一个被调用的方法,此时widget已经和当前State实例完成绑定,完全可以安全访问它的属性。同时别忘了在dispose中释放控制器资源,避免内存泄漏。
修改后的完整代码如下:
import 'package:flutter/material.dart'; class UpdateScreen extends StatefulWidget { final String idUpdate; final String nrpUpdate; final String namaUpdate; final String emailUpdate; final String jurusanUpdate; UpdateScreen({ this.idUpdate, this.nrpUpdate, this.namaUpdate, this.emailUpdate, this.jurusanUpdate }); @override _UpdateScreenState createState() => _UpdateScreenState(); } class _UpdateScreenState extends State<UpdateScreen> { // 先声明控制器变量,不初始化 TextEditingController _txtnrp; @override void initState() { super.initState(); // 在initState中完成初始化,此时widget已可用 _txtnrp = TextEditingController(text: widget.nrpUpdate); } @override void dispose() { // 释放控制器资源,避免内存泄漏 _txtnrp.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: IconButton( icon: Icon(Icons.arrow_left), onPressed: () => Navigator.pop(context, false), ), centerTitle: true, title: Text('Update ${widget.namaUpdate}'), ), body: Container( child: Center( child: SingleChildScrollView( padding: EdgeInsets.all(20), scrollDirection: Axis.vertical, child: Column( children: <Widget>[ TextField( controller: _txtnrp, keyboardType: TextInputType.number, decoration: InputDecoration(hintText: "NRP"), textAlign: TextAlign.center, ), ], ), ), ), ), ); } }
方案二:使用late延迟初始化
如果你习惯用更简洁的写法,可以用late关键字标记变量,延迟它的初始化时机,同样要在initState中完成赋值:
class _UpdateScreenState extends State<UpdateScreen> { // 用late标记延迟初始化 late TextEditingController _txtnrp; @override void initState() { super.initState(); _txtnrp = TextEditingController(text: widget.nrpUpdate); } // 同样要记得dispose释放资源 @override void dispose() { _txtnrp.dispose(); super.dispose(); } // 其余代码不变... }
注意:使用
late时一定要确保变量在被使用前已经完成初始化,否则会抛出运行时错误,所以initState是最安全的初始化时机。
内容的提问来源于stack exchange,提问作者Zeffry Reynando
相关产品推荐
相关产品推荐

