我在我的Flutter应用程序中创建了一个自定义的Numpad小部件。
class NumPadCheckout extends StatelessWidget {
final TextEditingController controller;
final Function delete;
final Function onSubmit;
const NumPadCheckout({
Key? key,
required this.delete,
required this.onSubmit,
required this.controller,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
const SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
NumberButtonCheckout(
number: "1",
controller: controller,
),
NumberButtonCheckout(
number: "2",
controller: controller,
),
NumberButtonCheckout(
number: "3",
controller: controller,
),
],
),
// const SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
NumberButtonCheckout(
number: "4",
controller: controller,
),
NumberButtonCheckout(
number: "5",
controller: controller,
),
NumberButtonCheckout(
number: "6",
controller: controller,
),
],
),
// const SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
NumberButtonCheckout(
number: "7",
controller: controller,
),
NumberButtonCheckout(
number: "8",
controller: controller,
),
NumberButtonCheckout(
number: "9",
controller: controller,
),
],
),
// const SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
// this button is used to delete the last number
NumberButtonCheckout(
number: "00",
controller: controller,
),
NumberButtonCheckout(
number: "0",
controller: controller,
),
CustomKey(
iconData: Icons.keyboard_backspace,
onPressed: () => delete,
)
],
),
],
);
}
}
class NumberButtonCheckout extends StatelessWidget {
final String number;
final TextEditingController controller;
const NumberButtonCheckout({
Key? key,
required this.number,
required this.controller,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(
width: width,
height: height,
child: ElevatedButton(
onPressed: () {
controller.text += number.toString();
},
child: Center(
child: Text(
number.toString(),
),
),
),
);
}
}
class CustomKey extends StatelessWidget {
final IconData iconData;
final VoidCallback? onPressed;
const CustomKey({
Key? key,
required this.iconData,
required this.onPressed,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(
width: width,
height: height,
child: ElevatedButton(
onPressed: () => onPressed,
child: Center(
child: Icon(
iconData
),
),
),
);
}
}
现在我想在一个屏幕中添加这个,并使用它来输入数字到同一屏幕上的多个TextFormField中。每个TextFormField都应该有自己的TextEditingControllers。当退格键在数字键盘中时,也需要清除数据。如何在Flutter中做到这一点?
2条答案
按热度按时间jckbn6z71#
由于您有2个文本字段,因此需要为每个 * 文本字段(两个文本字段都需要2个控制器)使用一个控制器。您可以创建一个第三个控制器,以了解当前正在使用的文本字段。
你可以这样做:
第三个控制器是您将传递给NumPadCheckout的控制器,以便在选择另一个TextField时,它会为新选择的TextField获取正确的控制器。
现在您需要根据选定的TextField更改第三个控制器的值。TextField有一个onTap属性,您可以使用该属性将您的第三个控制器设置为该TextField的控制器。
在你的构建方法中,你可以这样做:
您也可以使用Nguyen Family建议的FocusNode,但请记住将TextField的keyboardType设置为TextInputType。none
332nm8kg2#
显然,对于2个(或更多)文本字段,我们需要2个
TextEdittingController
。根据您的要求,此数字键盘将用于两个文本字段。所以问题是:我们如何知道正在键入哪个文本字段?噢,现在问题更清楚了。我建议你使用2个FocusNode,它们被称为
cashFocusNode
和creditFocusNode
,并将它们附加到2个TextEdittingController
中(不要忘记处理)。使用
NumberButtonCheckout
,可以像这样编写onPressed
函数:...
用backspace做同样的事情
CustomKey
。