Как заставить мое приложение Flutter генерировать числа только тогда, когда это необходимо? - PullRequest
0 голосов
/ 11 января 2020

Таким образом, идея моей программы состоит в том, чтобы генерировать случайные числа с помощью операторов, а затем сделать результат этой операции не для пользователя. И это работает, но мое приложение обновляет данные каждый раз, когда я совершаю какое-либо действие , такое как открытие TextField или отправка результата для сравнения ввода пользователя с фактическим ответом. Думаю, проблема в плохом государственном управлении, но я не могу понять, как это исправить самостоятельно. (У меня есть собственный класс по математике с функциями для программы, но мне не о чем беспокоиться)

Код, который требуется :

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(() {

                              });
                            },

Извините за плохое форматирование; (

Ответы [ 3 ]

0 голосов
/ 11 января 2020

Я не уверен, что вы пытаетесь достичь, но вот простой код, который вы можете попробовать, который не генерирует новый номер после проверки правильности ввода или нет, а также имеет новую кнопку генерации номера

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();
              });
            },
          ),
        ],
      ),
    );
  }
}
0 голосов
/ 11 января 2020

Итак, я решил эту проблему, превратив свой математический объект в несколько функций, а затем выполняя самую сложную работу до Widget build. Код:

  var b = (Random().nextInt(99) + 1);
  var operate = getOperator();
  var result;
  @override
  void initState(){
    result = calculate(a,operate,b);
    super.initState();
  }  

Спасибо всем за помощь!

0 голосов
/ 11 января 2020

Вы можете попробовать создать отдельный stateful виджет, содержащий часть кода, где вызывается setstate (), и преобразовать исходный виджет в без сохранения состояния .

В вашем коде виджет GameplayPage перестраивается при каждом обновлении любого значения. Это потому, что setstate () заставляет виджет перестраиваться. Таким образом, вы должны отделить вещи, которые не меняются, и вещи, которые меняются, на разные виджеты.

Например, вы можете создать FlatButton как пользовательский виджет и отправить необходимые данные в качестве параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...