首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么父setState中的StatefulWidget不更新子StatefulWidget

为什么父setState中的StatefulWidget不更新子StatefulWidget
EN

Stack Overflow用户
提问于 2020-10-12 16:10:11
回答 1查看 684关注 0票数 1

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

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

来自文档

调用setState会通知框架,该对象的内部状态发生了变化,可能会影响该子树中的用户界面,从而导致该框架为该状态对象安排构建。 如果您只是直接更改状态而不调用setState,框架可能不会安排构建,并且该子树的用户界面可能不会被更新以反映新的状态。

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

请解释我,为什么下面的例子不能像预期的那样工作(更改ChildStatefulWidget文本)。谢谢!

代码语言:javascript
复制
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),
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-12 16:22:55

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

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

您的代码无法工作,因为您发送了值抛出构造函数,但是构造函数并不是每次更改状态时都调用。因此,获取的抛出构造函数值不会更改。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64321438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档