繁体   English   中英

Flutter - 无法从父小部件更改子状态

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM