Flutter 中的“dispose”方法被调用为 null

saz*_*min 1 android dispose focus widget flutter

我想在 flutter 中制作 to do 应用程序,为了使用 focusNode 我编写了这段代码 ->

FocusNode _titleFocus;
FocusNode _descriptionFocus;
FocusNode _todoFocus;


@override
void initState() {
  // TODO: implement initState
super.initState();
if(widget.task!=null){

  _titleFocus = FocusNode();
  _descriptionFocus = FocusNode();
  _todoFocus = FocusNode();

  }
}

 @override
 void dispose() {
 // TODO: implement dispose
  _titleFocus.dispose();
  _descriptionFocus.dispose();
  _todoFocus.dispose();
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)

我首先在代码下方启动 FocusNode,该 focusNode 在退出待办任务对象时可以正常工作,但是当我想创建新的任务对象并将焦点传递给另一个对象时,它不起作用。我使用这段代码来传递焦点......

focusNode: _titleFocus,
_descriptionFocus.requestFocus();
Run Code Online (Sandbox Code Playgroud)

但它出错并显示消息 ->

The following NoSuchMethodError was thrown while finalizing the widget tree:
The method 'dispose' was called on null.
Receiver: null
Tried calling: dispose()
Run Code Online (Sandbox Code Playgroud)

voi*_*oid 5

“当我想创建一个新的并将焦点传递给另一个时,这是行不通的。”

由于方法中的条件,该方法FocusNode不会被实例化initState。因此出现错误( The method 'dispose' was called on null.)。

要修复此问题,您可以在调用方法中的 sdispose()之前检查条件。FocusNodedispose


 @override
 void dispose() {
 // TODO: implement dispose
if(widget.task!=null){ // check whether it is an existing todo or a new one before calling dispose
_titleFocus.dispose();
  _descriptionFocus.dispose();
  _todoFocus.dispose();
}
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)

更新:IF您可以使用以下null aware operator表示的方法来代替检查?.

添加了下面的示例:

 @override
 void dispose() {
 // TODO: implement dispose
if(widget.task!=null){ // check whether it is an existing todo or a new one before calling dispose
_titleFocus.dispose();
  _descriptionFocus.dispose();
  _todoFocus.dispose();
}
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)