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();
  }