#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 для кнопок?