Events 如何使我的颤振应用程序仅在需要时生成数字?
所以我的程序的想法是用操作符生成随机数,然后生成一个非用户的结果。它可以工作,但每次我做任何动作时,我的应用程序都会刷新数据,比如打开文本字段或提交结果以比较用户输入和实际答案。 我想问题是因为糟糕的状态管理,但我自己也不知道如何解决它。 (我有自己的数学课,课程中有函数,但哪里不需要担心) 代码显示所需的内容:Events 如何使我的颤振应用程序仅在需要时生成数字?,events,flutter,dart,state,Events,Flutter,Dart,State,所以我的程序的想法是用操作符生成随机数,然后生成一个非用户的结果。它可以工作,但每次我做任何动作时,我的应用程序都会刷新数据,比如打开文本字段或提交结果以比较用户输入和实际答案。 我想问题是因为糟糕的状态管理,但我自己也不知道如何解决它。 (我有自己的数学课,课程中有函数,但哪里不需要担心) 代码显示所需的内容: class _GameplayPageState extends State<GameplayPage> { @override Widget build(Buil
class _GameplayPageState extends State<GameplayPage> {
@override
Widget build(BuildContext context) {
var mathManager = Mathematics();
var firstNum = mathManager.getNumber();
var secondNum = mathManager.getNumber();
var mathOperator = mathManager.getOperator();
var calResult = mathManager.calculate(firstNum, mathOperator, secondNum);
Positioned(
top: 120,
child: Container(
width: screenWidth,
height: 230,
// decoration: BoxDecoration(color: Colors.orange),
child: Align(
alignment: Alignment.center,
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
SizedBox(
width: 10,
),
// >>>> LOOK HERE
Text(
firstNum.toString(),
style: TextStyle(
fontFamily: 'Montserrat',
fontSize: 100,
color: Color(0xff52de97),
letterSpacing: 0.5),
),
Text(
mathOperator,
style: TextStyle(
fontFamily: 'Montserrat',
fontSize: 70,
color: Color(0xff52de97),
),
),
Text(
secondNum.toString(),
style: TextStyle(
fontFamily: 'Montserrat',
fontSize: 100,
color: Color(0xff52de97),
letterSpacing: 0.5,
),
),
SizedBox(
width: 10,
),
],
),
),
),
),
),
child: TextField(
onSubmitted: (String value) async {
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: (value == calResult ? Text('Right') : Text('Wrong!')),
);
});
},
FlatButton(
onPressed: () {
setState(() {
});
},
class\u GameplayPageState扩展状态{
@凌驾
小部件构建(构建上下文){
var mathManager=数学();
var firstNum=mathManager.getNumber();
var secondNum=mathManager.getNumber();
var mathmoperator=mathManager.getOperator();
var calResult=mathManager.calculate(firstNum、mathmoperator、secondNum);
定位(
排名:120,
子:容器(
宽度:屏幕宽度,
身高:230,
//装饰:盒子装饰(颜色:颜色。橙色),
子对象:对齐(
对齐:对齐.center,
子:容器(
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
大小盒子(
宽度:10,
),
//看这里
正文(
firstNum.toString(),
样式:TextStyle(
fontFamily:“蒙特塞拉特”,
字体大小:100,
颜色:颜色(0xff52de97),
字母间距:0.5),
),
正文(
数学操作员,
样式:TextStyle(
fontFamily:“蒙特塞拉特”,
尺寸:70,
颜色:颜色(0xff52de97),
),
),
正文(
secondNum.toString(),
样式:TextStyle(
fontFamily:“蒙特塞拉特”,
字体大小:100,
颜色:颜色(0xff52de97),
字母间距:0.5,
),
),
大小盒子(
宽度:10,
),
],
),
),
),
),
),
孩子:TextField(
OnSubmited:(字符串值)异步{
等待显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
返回警报对话框(
内容:(value==calResult?Text('Right'):Text('error!')),
);
});
},
扁平按钮(
已按下:(){
设置状态(){
});
},
很抱歉格式错误;(您可以尝试创建一个单独的有状态的小部件,以包含调用setstate()的代码部分,并将原始小部件转换为无状态的小部件 在您的代码中,每当更新任何值时,GameplayPage小部件都会自行重建。这是因为setstate()会导致小部件重建。因此,您应该将未更改的内容与更改为不同小部件的内容分开
例如,您可以将FlatButton创建为自定义小部件,并将必要的详细信息作为参数发送。我不确定您想要实现什么,但这里有一些简单的代码,您可以尝试在检查输入是否正确后不生成新的数字,并且还有新的生成数字按钮
import 'dart:math';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
body: Pageone(),
),
);
}
}
class Pageone extends StatefulWidget {
@override
_PageoneState createState() => _PageoneState();
}
class _PageoneState extends State<Pageone> {
TextEditingController controller = TextEditingController();
int a = Random().nextInt(10);
int b = Random().nextInt(10);
int c;
String result;
@override
void initState() {
plus();
super.initState();
}
void plus() {
c = a + b;
}
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
SizedBox(
width: 10,
),
Text(
'$a',
style: TextStyle(
fontFamily: 'Montserrat',
fontSize: 100,
color: Color(0xff52de97),
letterSpacing: 0.5),
),
Text(
'$b',
style: TextStyle(
fontFamily: 'Montserrat',
fontSize: 100,
color: Color(0xff52de97),
),
),
Text(
'$c',
style: TextStyle(
fontFamily: 'Montserrat',
fontSize: 100,
color: Color(0xff52de97),
letterSpacing: 0.5,
),
),
SizedBox(
width: 10,
),
],
),
Form(
child: Column(
children: <Widget>[
Container(
width: 300,
child: TextFormField(
controller: controller,
onFieldSubmitted: (String value) {
setState(() =>
result = int.parse(value) == c ? 'true' : 'false');
},
),
),
],
),
),
Text(
result == null ? '' : '$result',
style: TextStyle(
fontFamily: 'Montserrat',
fontSize: 100,
color: Color(0xff52de97),
letterSpacing: 0.5),
),
MaterialButton(
child: Text('Generate new'),
onPressed: () {
setState(() {
a = Random().nextInt(10);
b = Random().nextInt(10);
plus();
});
},
),
],
),
);
}
}
import'dart:math';
进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
正文:Pageone(),
),
);
}
}
类Pageone扩展StatefulWidget{
@凌驾
_PageoneState createState();
}
类PageoneState扩展了状态{
TextEditingController=TextEditingController();
int a=Random().nextInt(10);
int b=Random().nextInt(10);
INTC;
字符串结果;
@凌驾
void initState(){
加();
super.initState();
}
void plus(){
c=a+b;
}
@凌驾
小部件构建(构建上下文){
返回容器(
子:列(
儿童:[
划船(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
大小盒子(
宽度:10,
),
正文(
“$a”,
样式:TextStyle(
fontFamily:“蒙特塞拉特”,
字体大小:100,
颜色:颜色(0xff52de97),
字母间距:0.5),
),
正文(
“$b”,
样式:TextStyle(
fontFamily:“蒙特塞拉特”,
字体大小:100,
颜色:颜色(0xff52de97),
),
),
正文(
var b = (Random().nextInt(99) + 1);
var operate = getOperator();
var result;
@override
void initState(){
result = calculate(a,operate,b);
super.initState();
}