我正在try 将文本从子窗口小部件设置为父窗口小部件.但是文本不会反映在父小部件中.

也try 使用setState(),但仍无法获得预期结果.

以下是我的代码:

void main() => runApp(new TestApp());

class TestApp extends StatefulWidget {
  @override
  _TestState createState() => new _TestState();
}

class _TestState extends State<TestApp>{

  String abc = "";

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        body: new Column(
          children: <Widget>[
            new Text("This is text $abc"),
            TestApp2(abc)
          ],
        ),
      ),
    );
  }
}


class TestApp2 extends StatefulWidget {

  String abc;

  TestApp2(this.abc);

  @override
  _TestState2 createState() => new _TestState2();
}

class _TestState2 extends State<TestApp2>{
  @override
  Widget build(BuildContext context) {
    return new Container(
      width: 150.0,
      height: 30.0,
      margin: EdgeInsets.only(top: 50.0),
      child: new FlatButton(
          onPressed: (){
            setState(() {
              widget.abc = "RANDON TEXT";
            });
          },
        child: new Text("BUTTON"),
        color: Colors.red,
      ),
    );
  }
}

我错过什么了吗?

推荐答案

在你的例子中,我们做了一些假设.我会试着一个接一个地移除.

  1. 您将abc从父项传递到子项,并在按下On按钮时改变了子项的值.由于基元类型在DART中为pass by value,因此在子代中更改abc的值不会更改父代abc的值.请参阅下面的代码片段.

    void main() {
      String abc = "oldValue";
      changeIt(abc);
      print(abc); // oldValue
    }
    
    void changeIt(String abc) {
      abc = "newValue";
      print(abc); //newValue
    }
    
  2. 让我们假设第一个是错误的(出于理解目的).然后,更改子对象中的值abc将更改父对象中的值abc.但是如果不调用父代的内部setState,则父代将不会反映该改变.在您的例子中,如果您按如下所示更改代码,它将在单击时单独更改按钮文本(因为调用了Child的setState).

      new FlatButton(
        onPressed: () {
          setState(
            () {
              widget.abc = "RANDON TEXT";
            },
          );
        },
        child:
            new Text(widget.abc), // setting the text based on abc
        color: Colors.red,
      ),
    
  3. 我建议使用callbacks,而不是使用globalState,因为随着应用程序的增长,globalState将很难维护/调试.请参考下面的代码.

        void main() => runApp(new TestApp());
    
        class TestApp extends StatefulWidget {
          @override
          _TestState createState() => new _TestState();
        }
    
        class _TestState extends State<TestApp> {
          String abc = "bb";
    
          callback(newAbc) {
            setState(() {
              abc = newAbc;
            });
          }
    
          @override
          Widget build(BuildContext context) {
            var column = new Column(
              children: <Widget>[
                new Text("This is text $abc"),
                TestApp2(abc, callback)
              ],
            );
            return new MaterialApp(
              home: new Scaffold(
                body: new Padding(padding: EdgeInsets.all(30.0), child: column),
              ),
            );
          }
        }
    
        class TestApp2 extends StatefulWidget {
          String abc;
          Function(String) callback;
    
          TestApp2(this.abc, this.callback);
    
          @override
          _TestState2 createState() => new _TestState2();
        }
    
        class _TestState2 extends State<TestApp2> {
          @override
          Widget build(BuildContext context) {
            return new Container(
              width: 150.0,
              height: 30.0,
              margin: EdgeInsets.only(top: 50.0),
              child: new FlatButton(
                onPressed: () {
                  widget.callback("RANDON TEXT"); //call to parent
                },
                child: new Text(widget.abc),
                color: Colors.red,
              ),
            );
          }
        }
    

Flutter相关问答推荐

Flutter日期和时间 Select 器未显示

当MyChangeNotifier更改时如何计算函数,而无需在构建方法中进行不必要的调用- Flutter

在创建肘部并使用冻结时,无法使用中的Copy With方法

Flutter 布局-全屏幕容器

如何将Will POP示波器转换为POP数据抖动的POP示波器

使用GO_ROUTER在模式内导航

Flutter 应用程序中的Firebase实时数据库中的orderByChild()不适用于我

在Fighter中,我如何在窗口的顶部和底部排列Widget?

为什么当我使用Riverpod更新状态时,列表会被刷新?

确保通过在CheckIfFavoriteMovieEvent((event,emit){...})上注册处理程序误差

如何给按钮的边框半径?

在 Flutter 中从 FireStore 获取数据并编译它们需要太多时间

网页浏览器不支持鼠标滚动的行项目

不使用 GlobalKey 仍然收到 GlobalKey 被多次使用的错误

Dart 撕掉 const 构造函数

Flutter可滚动定位列表支持rtl方向吗?

Riverpod 在使用冻结副本更新状态时触发重建,即使没有任何更改

仅使用 Flutter 在本地环境中托管 Web 服务器

主题:ThemeData() Flutter

Flutter NavigationBar 忽略我的背景 colored颜色