Flutter - 无法从父小部件更改子状态
Posted
技术标签:
【中文标题】Flutter - 无法从父小部件更改子状态【英文标题】:Flutter - Can't change child state from parent widget 【发布时间】:2020-04-14 01:11:57 【问题描述】:问题:
我有一个父小部件SnippetTestEditor
和一个有状态的子小部件NoteTab
。如果按下父窗口小部件中的按钮,则子窗口小部件应该得到更新。
两个类都有一个布尔值_editMode
。我通过构造函数将 bool 从父小部件传递给子小部件。据我了解,我需要在父小部件中调用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 ? ...
【问题讨论】:
【参考方案1】:发生这种情况是因为_editMode
值仅在initState()
内部传递给CodeTab
一次。因此,即使多次调用 build
方法,_tabs
中的 CodeTab
实例也不会更新。
您应该移动代码以在状态类内的方法中创建选项卡:
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(),
),
如果您对此解决方案有任何疑问,请在 cmets 中告诉我。
【讨论】:
以上是关于Flutter - 无法从父小部件更改子状态的主要内容,如果未能解决你的问题,请参考以下文章