要在按下按钮时更改 EntryTextbox 小部件的状态,请将包含小部件(我想是 CalculatorFrame)声明为 StatefullWidget 并使用 String 或任何字段,您将从中初始化 EntryTextbox .实现一个函数,在按下按钮时更改该字段,并将其作为构造函数参数传递给 NumberButton 小部件。
这是一个示意图示例:
import 'package:flutter/material.dart';
class CalculatorFrame extends StatefulWidget {
@override
_CalculatorFrameState createState() => _CalculatorFrameState();
}
class _CalculatorFrameState extends State<CalculatorFrame> {
String _text;
@override
Widget build(BuildContext context) => ...( // container widget of your choice
EntryTextbox(text: _text),
NumberButton(text: '0', onPressed: _onPressed,),
...,
NumberButton(text: '9', onPressed: _onPressed,),
);
void _onPressed(String buttonText) =>
setState(() => _text += buttonText);
}
class EntryTextbox extends StatelessWidget {
final String text;
const EntryTextbox({Key key, this.text}) : super(key: key);
@override
Widget build(BuildContext context) => ...(text: text); // text entry widget of your choice
}
class NumberButton extends StatelessWidget {
final String text;
final Function(String) onPressed;
const NumberButton({Key key, this.onPressed, this.text}) : super(key: key);
@override
Widget build(BuildContext context) => ...Button( // button widget of your choice
child: Text(text),
onPressed: () => onPressed(text),
);
}
由于在您的示例中 NumberButton 小部件位于 NumberBoards 小部件内,因此 NumberBoards 有责任接受 onPressed 作为构造函数参数并将其传递给每个 NumberButton 构造函数。
在我的示例中,onPressed 接受 String 参数 - 按下按钮的文本。您可能决定传递int 或者更复杂的数据类。
这种非架构方法适用于小型应用程序和示例。但是,我宁愿推荐使用 BLoC 或 ScopedModel 来完成您的任务。官方文档的Simple app state management 部分可能会有所帮助。