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