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 - 无法从父小部件更改子状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中从父小部件访问所有孩子的状态?

在颤振中从父小部件调用 setState 不会更新状态

调整父小部件的大小以适应 Flutter 中的子帖子“变换”

Flutter 重建父小部件

如何在 Flutter 中正确重用 Provider

在子小部件中,如何在 kivy 中获取父小部件的实例