保存TextField输入颤动



我试图保存写入文本字段的数据,但发生了两件奇怪的事情:

  • 第一个是,如果我从键盘上按end,它会删除我键入的

  • 第二次保存数据,然后当我打印出下面的几行代码时,它会给我";nil";

你认为这应该是什么?

child: TextField(
controller: _textEditingController,
inputFormatters: [
//FilteringTextInputFormatter.digitsOnly,
new LengthLimitingTextInputFormatter(6),
],
decoration: InputDecoration(
filled: true,
hintText: localization.placeholder_pay,
fillColor: Colors.white,
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
onChanged:(p) {
price = p;
},
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18.0,
color: Colors.black,
),
),
onPressed: () async {
//var tickets = _textEditingController.text;
print('WORK: ${_textEditingController.text}');

更新

Widget build(BuildContext context) {
TextEditingController _textEditingController = TextEditingController();
String price;
//String code;
Size size = MediaQuery
.of(context)
.size;
Size cardSize = Size(
size.width * .9,
size.height * .45,
);
return Dialog(
backgroundColor: appColors.primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topRight: Radius.circular(20),
bottomRight: Radius.circular(20),
bottomLeft: Radius.circular(20),
),
),
child: Container(
height: cardSize.height,
width: cardSize.width,
child: Stack(
alignment: AlignmentDirectional.center,
children: [
Positioned(
top: -35,
left: -25,
child: Transform.rotate(
angle: .9,
child: Container(
color: appColors.red,
height: 60,
width: 60,
),
),
),
Positioned(
top: 5 + size.height * .02,
bottom: 10 + size.height * .057,
child: Container(
width: cardSize.width * .85,
child: Column(
children: [
Expanded(
child: AutoSizeText(
localization.payment_receive,
maxLines: 2,
style: Theme
.of(context)
.primaryTextTheme
.bodyText1
.copyWith(
color: appColors.green,
fontSize: 20,
),
maxFontSize: 20,
minFontSize: 20,
textAlign: TextAlign.center,
),
),
Expanded(
child: AutoSizeText(
userDataByCode.firstName + " " + userDataByCode.surname,
maxLines: 1,
style: Theme
.of(context)
.primaryTextTheme
.bodyText1
.copyWith(
fontSize: 20,
),
maxFontSize: 20,
minFontSize: 20,
textAlign: TextAlign.center,
),
),
Expanded(
child: TextField(
controller: _textEditingController,
inputFormatters: [
//FilteringTextInputFormatter.digitsOnly,
new LengthLimitingTextInputFormatter(6),
],
decoration: InputDecoration(
filled: true,
hintText: localization.placeholder_pay,
fillColor: Colors.white,
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
onChanged:(p) {
price = p;
},
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18.0,
color: Colors.black,
),
),
),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: AutoSizeText(
"Saldo rimanente:",
style: Theme
.of(context)
.primaryTextTheme
.bodyText1
.copyWith(
fontSize: 20,
color: appColors.green,
),
maxLines: 1,
group: _group,
),
),
AutoSizeText(
NumberFormat.currency(
locale: "it",
decimalDigits: 2,
symbol: "€")
.format(userDataByCode.balance / 100),
style: Theme
.of(context)
.primaryTextTheme
.bodyText1
.copyWith(
fontSize: 20,
color: appColors.black,
),
group: _group,
),
],
),
),
],
),
),
),
Positioned(
bottom: 10,
width: size.width * .4,
height: size.height * .05,
child: ElevatedButton(
child: Container(
height: size.height * .03,
child: AutoSizeText(
localization.btn_pay,
style: Theme
.of(context)
.primaryTextTheme
.button
.copyWith(fontSize: 50),
maxLines: 1,
stepGranularity: .1,
),
),
onPressed: () async {
var tickets = int.parse(_textEditingController.text);
print('WORK: ${tickets}');
connection.makePayment(context, num_ticket: tickets, codice: "ABC124");
Navigator.pop(context);
},
),
),
],
),
),
);

}}

首先,假设它是有状态小部件类型的子类。

您不应该在build((中定义变量,因为当您更改状态时,它将再次呈现,并且您将丢失其值。

这些必须在生成((之上定义。

其次,这里是一个使用TextField的例子,按下按钮后,将显示控制器的值。

import 'package:flutter/material.dart';
class TextFieldExample extends StatefulWidget {
TextFieldExample({Key key}) : super(key: key);
@override
_TextFieldExampleState createState() => _TextFieldExampleState();
}
class _TextFieldExampleState extends State<TextFieldExample> {
TextEditingController _textEditingController = TextEditingController();
String price = '';
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
controller: _textEditingController,
inputFormatters: [
//FilteringTextInputFormatter.digitsOnly,
],
decoration: InputDecoration(
filled: true,
fillColor: Colors.white,
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
onChanged: (p) {
price = p;
},
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18.0,
color: Colors.black,
),
),
FlatButton(onPressed: () => setState(() {
print('Price value: $price');
}), child: Text('SAVE')),
Text(_textEditingController.text)
],
);
}
}