如何在build方法以外的State类中访问Stateful widget变量?

6

我想要访问在_UpdateNotesState中声明的'updateNotesModel'变量。我发现可以使用下面Scaffold中展示的'widget'关键字来实现。但是问题在于,我希望在build方法之外访问该变量,以便为TextEditingController设置默认值。我该如何做到这一点?

class UpdateNotes extends StatefulWidget {

  final NotesModel updateNotesModel;
  UpdateNotes({Key key, this.updateNotesModel}): super(key: key);

  @override
  _UpdateNotesState createState() => _UpdateNotesState();
}

class _UpdateNotesState extends State<UpdateNotes> {

  TextEditingController _titleController = 
new TextEditingController(text: widget.updateNotesModel.someValue); //getting an error
}

@override
  Widget build(BuildContext context) {
    return Scaffold(
    var a = widget.updateNotesModel.someValue
     .
     .
     .
     )
    }
}
3个回答

9
你可以在 initState 中完成它:
class _UpdateNotesState extends State<UpdateNotes> {
  TextEditingController _titleController = new TextEditingController(); 

  @override
  void initState() {
    _titleController.text= widget.updateNotesModel.someValue;
    super.initState();
  }
}

嘿,感谢您提供的解决方案!还有一个问题,是否有办法在Flutter强制将updateNotesModel成员初始化为final的情况下,更改其值?例如widget.updateNotesModel.someValue = newValue。 - Abhishek
没问题。这个变量在父部件中不应该是常量。你可以在父部件中使用 setState,然后Flutter会重建小部件树并重新初始化你的小部件。 - nucleartux
或者,如果您不想在此小部件中更改它,您应该将“updateNotesModel”作为状态的一部分,而不是小部件。 - nucleartux
再次感谢,我会尝试一下,希望我能弄清楚! - Abhishek

2
现在你可以使用 late 关键字了。来自文档

Dart 2.12添加了late修饰符,它有两个用途:

  • 声明在其声明之后初始化的非空变量。
  • 延迟初始化变量。
class _UpdateNotesState extends State<UpdateNotes> {
  late TextEditingController _titleController = new TextEditingController(text: widget.updateNotesModel.someValue);

  @override
  Widget build(BuildContext context) {
    .
    .
    .
  }
}


0

很遗憾,这是不可能的,因为在初始化时无法访问widget关键字。


1
两年前被接受的答案表明这是可以实现的。那个答案错了吗? - Jeremy Caney
@JeremyCaney 我认为他的意思是我们无法在 State 类的 build 方法之外或任何其他方法中访问 widget 的变量。 - M Imam Pratama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接