【问题标题】:Why setState in parent StatefulWidget do not update child StatefulWidget [duplicate]为什么父 StatefulWidget 中的 setState 不更新子 StatefulWidget [重复]
【发布时间】:2021-01-26 23:29:02
【问题描述】:

我知道,从父 StatefulWidget 更新子 StatefulWidget 的正确方法是使用子 GlobalKey 实例。

但我不明白,为什么 setState(() {}) 不这样做!我没有找到任何关于此的文档或解释。

来自documentation

调用 setState 通知框架内部状态 此对象的更改方式可能会影响用户界面 在这个子树中,这会导致框架为 这个 State 对象。

如果你只是直接改变状态而不调用 setState, 框架可能不会为此安排构建和用户界面 子树可能不会更新以反映新状态。

通过文档,我希望整个小部件子树将被更新。但事实并非如此。

请解释一下,为什么下面的示例不能按预期工作(更改 ChildStatefulWidget 的文本)。 谢谢!

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

class ParentStatefulWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return ParentState();
  }
}

class ParentState extends State<ParentStatefulWidget> {
  int counter = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        GestureDetector(
          child: Container(
              color: Colors.lightBlue,
              padding: EdgeInsets.all(10),
              child: Text(
                "Tap me",
                style: TextStyle(color: Colors.white, fontSize: 24),
              )),
          onTap: () {
            setState(() {
              counter = counter + 1;
            });
          },
        ),
        ChildStatefulWidget(
          text: "Count: $counter",
        )
      ],
    );
  }
}

class ChildStatefulWidget extends StatefulWidget {
  final String text;

  ChildStatefulWidget({Key key, this.text = ""}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return ChildState(text);
  }
}

class ChildState extends State<ChildStatefulWidget> {
  final String text;

  ChildState(this.text);

  @override
  Widget build(BuildContext context) {
    return Text(
      text,
      style: TextStyle(fontSize: 18),
    );
  }
}

【问题讨论】:

    标签: flutter dart flutter-layout statefulwidget


    【解决方案1】:

    您不需要在 childState 中创建“文本” - 只需使用“widget.text”:

    class ChildState extends State<ChildStatefulWidget> {    
      @override
      Widget build(BuildContext context) {
        return Text(
          widget.text,
          style: TextStyle(fontSize: 18),
        );
      }
    }
    

    您的代码不起作用,因为您发送值抛出构造函数,但构造函数不会在每次更改状态时调用。所以得到的 throw 构造函数值不会改变。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2019-02-12
      • 2020-02-25
      • 2020-08-16
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多