[英]Flutter - Can't change child state from parent widget
问题:
我有一个父控件SnippetTestEditor
和有状态的子控件NoteTab
。 如果按下父小部件中的按钮,则子小部件应该得到更新。
这两个类都有一个 bool _editMode
。 我通过构造函数将 bool 从父小部件传递给子小部件。 从我understandig,我需要调用setState()
的父窗口部件和内改变布尔setState()
此更改应自动反映在子小部件中。 但这不是......
那么我怎样才能让子小部件改变呢?
代码:
class _SnippetTestEditorState extends State<SnippetTestEditor> with SingleTickerProviderStateMixin {
bool _editMode = true;
...
@override
void initState() {
super.initState();
_tabs = List();
_tabNames = List();
List<CodeSnippet> codeSnippets = this.widget._note.codeSnippets;
for(CodeSnippet snippet in codeSnippets){
_tabs.add(CodeTab(_editMode);
...
}
@override
Widget build(BuildContext context) {
return Scaffold(
...
body: TabBarView(
controller: _tabController,
children: _tabs
),
...
actions: <Widget>[
IconButton(
icon: Icon(Icons.check),
onPressed: (){
setState(() {
_editMode = false;
});
},
)
...
class CodeTab extends StatefulWidget{
bool _editMode;
CodeTab(this._editMode);
@override
State<StatefulWidget> createState() => CodeTabState();
}
class CodeTabState extends State<CodeTab> {
@override
Widget build(BuildContext context) {
return this.widget._editMode ? ...
发生这种情况是因为_editMode
值仅在initState()
内部传递给CodeTab
一次。 所以,即使build
方法被调用多次的CodeTab
的情况下_tabs
没有更新。
您应该移动代码以在 state 类中的方法中创建选项卡:
getTabs(){
List<CodeSnippet> codeSnippets = widget._note.codeSnippets;
for(CodeSnippet snippet in codeSnippets){
_tabs.add(CodeTab(_editMode);
return _tabs;
}
并在构建中使用getTabs()
:
body: TabBarView(
controller: _tabController,
children: getTabs(),
),
如果您对此解决方案有任何疑问,请在评论中告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.