Как отобразить текст в виджете «Текст» после нажатия плоской кнопки?

#dart #flutter #statelesswidget

#dart #флаттер #statelesswidget

Вопрос:

Я пытаюсь создать приложение-калькулятор с использованием flutter, где вместо ввода с клавиатуры я хочу вводить ввод с помощью некоторых кнопок. Проблема возникает, когда я нажимаю кнопку, но она не отображает соответствующие данные в текстовом виджете выше.

Все мои классы не имеют состояния, за исключением первого класса MyApp, который отслеживает состояние.

Я попытался создать общую переменную вне всех классов и использовать ее для переноса текста из класса button в класс display, но это не сработало.

Общая переменная — «_calcText»

 class DisplayAnswer extends StatelessWidget {

  final String _text;

  DisplayAnswer(this._text);

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: 2,
      child: Material(
        color: Colors.greenAccent,
        child: Ink(
          padding: EdgeInsets.all(10.0),
          child: Center(
            child: Container(
              constraints: BoxConstraints.expand(),
              decoration: BoxDecoration(border: Border.all(color: Colors.black, width: 5.0), color: Colors.white),
              child: Text(_text,style: TextStyle(fontSize: 50.0), textAlign: TextAlign.center,),
            ),
          ),
        ),
      ),
    );
  }
}


class NumButtons extends StatelessWidget {
  final String _number;

  NumButtons(this._number);

  @override
  Widget build(BuildContext context) {
    return FlatButton(
      onPressed: () {
        _calcText = _calcText   _number;
        print(_calcText);
        DisplayAnswer(_calcText);
      } ,
      child: Text(_number.toString(), style: TextStyle(fontSize: 30.0),),
      color: Colors.white
    );
  }
}
  

Я хочу отобразить значение _calcText в текстовом виджете DisplayAnswer. Я хочу, чтобы _calcText также менялся при нажатии других кнопок, т. Е. При нажатии 2 Текст должен отображать только 2, при нажатии 5 после этого должно отображаться 25

Полный код здесь:https://drive.google.com/open?id=1C4MLAkjowloicbjBP_uV8BfpPzhz4Yxf

Ответ №1:

Используйте виджет с полным состоянием вместо StatelessWidget. Вызовите setState() метод для onPressed функции после завершения операции. Он создаст ваш виджет с новым значением.

На DisplayAnswer вам нужно создать функцию для увеличения значения, а затем передать эту функцию в качестве параметра NumButtons .

Передайте обратный вызов Function в NumButtons , например:

 class NumButtons extends StatelessWidget {
  final String _number;
  final Function callback;
...
  

Комментарии:

1. Я сделал это, преобразовав класс numbuttons в виджет без состояния, мой код выглядит следующим образом: onPressed: () { _calcText = _calcText _number; setState(() {}); DisplayAnswer(_calcText); } , Но это не работает

2. setState({ _calcText = _calcText _number });

3. onPressed: () { setState(() {_calcText = _calcText _number;}); DisplayAnswer(_calcText); } , Мне пришлось поместить () в setState, потому что он выдает ошибку: «Set<String> не присваивается типу параметра ‘() -> void’ «, также это не исправило. Также, похоже, он не перестраивает DisplayAnswer, потому что я ввел случайную строку в качестве параметра для DisplayAnswer, когда ее вызывали через onPressed, но фиктивная строка не отображалась.

4. Используйте виджет с полным состоянием вместо StatelessWidget. Взгляните на начальный пример flutter. Он увеличивает значение после щелчка.

5. В исходном примере flutter виджет кнопки находится в том же классе, но для моей программы все кнопки являются отдельным классом. Могу ли я вызвать функцию в DisplayAnswer из onPressed для кнопок?