无法使用颤振形式的重置方法清除文本字段
Not able to clear text fields using reset method in flutter form
我正在设计一种 flutter 表单,它使用 TextField 小部件为两个文本字段输入,一个使用 DateTimeField 的时间字段和一个使用 WeekDay 选择器小部件的日期选择器。我已使用重置方法重置表单,但这只是重置 BasicTimeField 小部件,无法重置所有其他字段。
class MyCustomForm extends StatefulWidget {
const MyCustomForm({Key? key}) : super(key: key);
@override
State<MyCustomForm> createState() => _MyCustomFormState();
}
class _MyCustomFormState extends State<MyCustomForm> {
final formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
var ht = MediaQuery.of(context).size.height;
var wd = MediaQuery.of(context).size.width;
return Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(
height: ht / 20,
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Subject",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Type Subject name here',
),
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Class Link",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: const TextField(
decoration: InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Paste class link here',
),
),
),
Center(
child: Text(
"Timing",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
BasicTimeField(),
SizedBox(
width: wd / 9,
child: Center(
child: Text(
"to",
style:
TextStyle(fontSize: ht / 40, fontWeight: FontWeight.w400),
),
),
),
BasicTimeField()
]),
SizedBox(
height: ht / 40,
),
Center(
child: Text(
"Select days of week",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
DayPicker(),
SizedBox(
height: ht / 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
child: Text('Add'),
onPressed: () => formKey.currentState?.save(),
),
const SizedBox(
width: 50,
),
ElevatedButton(
child: Text('Reset'),
onPressed: () => formKey.currentState?.reset(),
),
],
)
],
),
);
}
}
formKey.currentState?.reset()
这行代码重置所有 表单字段,它们是 Form() 的后代。它仅适用于 TextFormField 小部件。
您可以将所有 TextField 小部件更改为 TextFormField,这样重置就会对它们起作用。
在您的表单中重置无效,因为您使用的文本字段在使用时不会重置
formKey.currentState?.reset()
Try changing the Textform to TextFormField
现在,它会起作用。
完整更新代码(来自您的代码)
import 'package:flutter/material.dart';
class MyCustomForm extends StatefulWidget {
const MyCustomForm({Key? key}) : super(key: key);
@override
State<MyCustomForm> createState() => _MyCustomFormState();
}
class _MyCustomFormState extends State<MyCustomForm> {
final formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
var ht = MediaQuery.of(context).size.height;
var wd = MediaQuery.of(context).size.width;
return Scaffold(
body: Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(
height: ht / 20,
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Subject",
style:
TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Type Subject name here',
),
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Class Link",
style:
TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Paste class link here',
),
),
),
Center(
child: Text(
"Timing",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
// BasicTimeField(),
SizedBox(
width: wd / 9,
child: Center(
child: Text(
"to",
style: TextStyle(
fontSize: ht / 40, fontWeight: FontWeight.w400),
),
),
),
// BasicTimeField()
]),
SizedBox(
height: ht / 40,
),
Center(
child: Text(
"Select days of week",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
// DayPicker(),
SizedBox(
height: ht / 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
child: Text('Add'),
onPressed: () => formKey.currentState?.save(),
),
const SizedBox(
width: 50,
),
ElevatedButton(
child: Text('Reset'),
onPressed: () => formKey.currentState?.reset(),
),
],
)
],
),
),
);
}
}
输出
正在输入数据
复位后清零
我正在设计一种 flutter 表单,它使用 TextField 小部件为两个文本字段输入,一个使用 DateTimeField 的时间字段和一个使用 WeekDay 选择器小部件的日期选择器。我已使用重置方法重置表单,但这只是重置 BasicTimeField 小部件,无法重置所有其他字段。
class MyCustomForm extends StatefulWidget {
const MyCustomForm({Key? key}) : super(key: key);
@override
State<MyCustomForm> createState() => _MyCustomFormState();
}
class _MyCustomFormState extends State<MyCustomForm> {
final formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
var ht = MediaQuery.of(context).size.height;
var wd = MediaQuery.of(context).size.width;
return Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(
height: ht / 20,
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Subject",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Type Subject name here',
),
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Class Link",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: const TextField(
decoration: InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Paste class link here',
),
),
),
Center(
child: Text(
"Timing",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
BasicTimeField(),
SizedBox(
width: wd / 9,
child: Center(
child: Text(
"to",
style:
TextStyle(fontSize: ht / 40, fontWeight: FontWeight.w400),
),
),
),
BasicTimeField()
]),
SizedBox(
height: ht / 40,
),
Center(
child: Text(
"Select days of week",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
DayPicker(),
SizedBox(
height: ht / 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
child: Text('Add'),
onPressed: () => formKey.currentState?.save(),
),
const SizedBox(
width: 50,
),
ElevatedButton(
child: Text('Reset'),
onPressed: () => formKey.currentState?.reset(),
),
],
)
],
),
);
}
}
formKey.currentState?.reset()
这行代码重置所有 表单字段,它们是 Form() 的后代。它仅适用于 TextFormField 小部件。
您可以将所有 TextField 小部件更改为 TextFormField,这样重置就会对它们起作用。
在您的表单中重置无效,因为您使用的文本字段在使用时不会重置
formKey.currentState?.reset()
Try changing the Textform to TextFormField
现在,它会起作用。
完整更新代码(来自您的代码)
import 'package:flutter/material.dart';
class MyCustomForm extends StatefulWidget {
const MyCustomForm({Key? key}) : super(key: key);
@override
State<MyCustomForm> createState() => _MyCustomFormState();
}
class _MyCustomFormState extends State<MyCustomForm> {
final formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
var ht = MediaQuery.of(context).size.height;
var wd = MediaQuery.of(context).size.width;
return Scaffold(
body: Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(
height: ht / 20,
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Subject",
style:
TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Type Subject name here',
),
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: wd / 40, vertical: 1),
child: Text(
"Class Link",
style:
TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: wd / 40, vertical: ht / 60),
child: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(), // UnderlineInputBorder(),
hintText: 'Paste class link here',
),
),
),
Center(
child: Text(
"Timing",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
// BasicTimeField(),
SizedBox(
width: wd / 9,
child: Center(
child: Text(
"to",
style: TextStyle(
fontSize: ht / 40, fontWeight: FontWeight.w400),
),
),
),
// BasicTimeField()
]),
SizedBox(
height: ht / 40,
),
Center(
child: Text(
"Select days of week",
style: TextStyle(fontSize: ht / 30, fontWeight: FontWeight.w500),
)),
// DayPicker(),
SizedBox(
height: ht / 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
child: Text('Add'),
onPressed: () => formKey.currentState?.save(),
),
const SizedBox(
width: 50,
),
ElevatedButton(
child: Text('Reset'),
onPressed: () => formKey.currentState?.reset(),
),
],
)
],
),
),
);
}
}
输出
正在输入数据
复位后清零