Dart 颤振状态小部件-按钮单击时保存状态的问题

Dart 颤振状态小部件-按钮单击时保存状态的问题,dart,flutter,state,Dart,Flutter,State,下面是一个简单的代码(在main.dart中),我试图用它来重温几个月前我所做的颤振基础知识 在下面的代码中,setState()未按预期工作,原因是状态错误 我可以通过创建单独的statefulwidget使其可用,其中的states构成按钮和文本更改的以下元素 但在这里我想知道的是,有没有可能在下面的代码中进行最小的更改,以匿名的方式完成它 import 'package:flutter/material.dart'; var textStrings = ["Hello", "Hi", "

下面是一个简单的代码(在main.dart中),我试图用它来重温几个月前我所做的颤振基础知识

在下面的代码中,setState()未按预期工作,原因是状态错误

我可以通过创建单独的statefulwidget使其可用,其中的states构成按钮和文本更改的以下元素

但在这里我想知道的是,有没有可能在下面的代码中进行最小的更改,以匿名的方式完成它

import 'package:flutter/material.dart';

var textStrings = ["Hello", "Hi", "Hey", "Aloha"];
var counter = 0;

void main() => runApp(MaterialApp(
      title: "Hello",
      home: Scaffold(
        appBar: AppBar(
          title: Text(
            "First App",
            style: TextStyle(
                color: Colors.white70,
                fontSize: 20,
                fontStyle: FontStyle.normal),
          ),
        ),
        body: Container(
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                Padding(padding: EdgeInsets.only(top: 20)),
                Card(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      Padding(padding: EdgeInsets.only(bottom: 20)),
                      Center(
                        child: Text("With Flutter, Spread Fluttery",
                            style: TextStyle(
                                color: Colors.redAccent,
                                fontStyle: FontStyle.italic,
                                fontSize: 30)),
                      ),
                      Padding(padding: EdgeInsets.only(bottom: 20)),
                      Icon(
                        Icons.refresh,
                        size: 50,
                        color: Colors.amberAccent,
                      ),
                      Padding(padding: EdgeInsets.only(bottom: 20)),
                      Text(textStrings[counter % 4],
                          style: TextStyle(
                              color: Colors.black38,
                              fontSize: 30,
                              fontStyle: FontStyle.normal)),
                      Padding(padding: EdgeInsets.only(bottom: 20)),
                      RaisedButton(
                        onPressed: () {
                          setState() {
                            counter++;
                          }
                        },
                        child: Text("Enter",
                            style: TextStyle(
                              color: Colors.teal,
                              fontSize: 30,
                            )),
                      )
                    ],
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    ));
导入“包装:颤振/材料.省道”;
var textStrings=[“你好”、“你好”、“嘿”、“你好”];
var计数器=0;
void main()=>runApp(MaterialApp(
标题:“你好”,
家:脚手架(
appBar:appBar(
标题:正文(
“第一个应用程序”,
样式:TextStyle(
颜色:颜色。白色70,
尺寸:20,
fontStyle:fontStyle.normal),
),
),
主体:容器(
儿童:中心(
子:列(
mainAxisAlignment:mainAxisAlignment.start,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
填充(填充:仅限边集(顶部:20)),
卡片(
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
填充(填充:仅限边集(底部:20)),
居中(
子:文本(“带颤振,展开颤振”,
样式:TextStyle(
颜色:Colors.redAccent,
fontStyle:fontStyle.italic,
尺寸:30),,
),
填充(填充:仅限边集(底部:20)),
图标(
图标。刷新,
尺码:50,
颜色:Colors.amberAccent,
),
填充(填充:仅限边集(底部:20)),
文本(文本字符串[计数器%4],
样式:TextStyle(
颜色:颜色。黑色38,
尺寸:30,
fontStyle:fontStyle.normal),
填充(填充:仅限边集(底部:20)),
升起的按钮(
已按下:(){
setState(){
计数器++;
}
},
子项:文本(“输入”,
样式:TextStyle(
颜色:Colors.teal,
尺寸:30,
)),
)
],
),
)
],
),
),
),
),
));

我认为没有办法做到这一点,因为runApp无法使用statefull小部件重新绘制。这只是应用程序的起点


只需在main方法中更改应用程序的标题,并使用热重新加载,它将不会在结果中重新显示,使用播放按钮(运行按钮),它将正常工作。

如果添加几行代码,您可以使用
StatefulBuilder

将容器包装在
StatefulBuilder
中,并在按钮的
onPressed
方法中更改
setState((){})

            void main() => runApp(MaterialApp(
                  title: "Hello",
                  home: Scaffold(
                      appBar: AppBar(
                        title: Text(
                          "First App",
                          style: TextStyle(
                              color: Colors.white70,
                              fontSize: 20,
                              fontStyle: FontStyle.normal),
                        ),
                      ),
                      body: StatefulBuilder(
                        builder: (context, setState) {
                          return Container(
                            child: Center(
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.start,
                                crossAxisAlignment: CrossAxisAlignment.stretch,
                                children: <Widget>[
                                  Padding(padding: EdgeInsets.only(top: 20)),
                                  Card(
                                    child: Column(
                                      crossAxisAlignment: CrossAxisAlignment.stretch,
                                      children: <Widget>[
                                        Padding(padding: EdgeInsets.only(bottom: 20)),
                                        Center(
                                          child: Text("With Flutter, Spread Fluttery",
                                              style: TextStyle(
                                                  color: Colors.redAccent,
                                                  fontStyle: FontStyle.italic,
                                                  fontSize: 30)),
                                        ),
                                        Padding(padding: EdgeInsets.only(bottom: 20)),
                                        Icon(
                                          Icons.refresh,
                                          size: 50,
                                          color: Colors.amberAccent,
                                        ),
                                        Padding(padding: EdgeInsets.only(bottom: 20)),
                                        Text(textStrings[counter % 4],
                                            style: TextStyle(
                                                color: Colors.black38,
                                                fontSize: 30,
                                                fontStyle: FontStyle.normal)),
                                        Padding(padding: EdgeInsets.only(bottom: 20)),
                                        RaisedButton(
                                          onPressed: () {
                                            setState(() {
                                              counter++;
                                            });
                                          },
                                          child: Text("Enter : $counter",
                                              style: TextStyle(
                                                color: Colors.teal,
                                                fontSize: 30,
                                              )),
                                        )
                                      ],
                                    ),
                                  )
                                ],
                              ),
                            ),
                          );
                        },
                      )),
                ));
void main()=>runApp(MaterialApp(
标题:“你好”,
家:脚手架(
appBar:appBar(
标题:正文(
“第一个应用程序”,
样式:TextStyle(
颜色:颜色。白色70,
尺寸:20,
fontStyle:fontStyle.normal),
),
),
正文:StatefulBuilder(
生成器:(上下文,设置状态){
返回容器(
儿童:中心(
子:列(
mainAxisAlignment:mainAxisAlignment.start,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
填充(填充:仅限边集(顶部:20)),
卡片(
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
填充(填充:仅限边集(底部:20)),
居中(
子:文本(“带颤振,展开颤振”,
样式:TextStyle(
颜色:Colors.redAccent,
fontStyle:fontStyle.italic,
尺寸:30),,
),
填充(填充:仅限边集(底部:20)),
图标(
图标。刷新,
尺码:50,
颜色:Colors.amberAccent,
),
填充(填充:仅限边集(底部:20)),
文本(文本字符串[计数器%4],
void main() => runApp(MaterialApp(
      title: "Hello",
      home: Scaffold(
        appBar: AppBar(
          title: Text(
            "First App",
            style: TextStyle(
                color: Colors.white70,
                fontSize: 20,
                fontStyle: FontStyle.normal),
          ),
        ),
        body: MyAppWidgets(),
      ),
    )
);

class MyAppWidgets extends StatefulWidget {
  @override
  _MyAppWidgetsState createState() => _MyAppWidgetsState();
}

class _MyAppWidgetsState extends State<MyAppWidgets> {
  var textStrings = ["Hello", "Hi", "Hey", "Aloha"];
  var counter = 0;
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Padding(padding: EdgeInsets.only(top: 20)),
            Card(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Padding(padding: EdgeInsets.only(bottom: 20)),
                  Center(
                    child: Text("With Flutter, Spread Fluttery",
                        style: TextStyle(
                            color: Colors.redAccent,
                            fontStyle: FontStyle.italic,
                            fontSize: 30)),
                  ),
                  Padding(padding: EdgeInsets.only(bottom: 20)),
                  Icon(
                    Icons.refresh,
                    size: 50,
                    color: Colors.amberAccent,
                  ),
                  Padding(padding: EdgeInsets.only(bottom: 20)),
                  Text(textStrings[counter % 4],
                      style: TextStyle(
                          color: Colors.black38,
                          fontSize: 30,
                          fontStyle: FontStyle.normal)),
                  Padding(padding: EdgeInsets.only(bottom: 20)),
                  RaisedButton(
                    onPressed: () {
                      setState(() {
                        counter++;
                      });
                    },
                    child: Text("Enter",
                        style: TextStyle(
                          color: Colors.teal,
                          fontSize: 30,
                        )),
                  )
                ],
              ),
            )
          ],
        ),
      ),
    );
  }
}