我想从其他状态更新 TextField 值,我从父小部件传递(并在 中设置文本initState()
)。我的 TextField 小部件设置了一次值,但在状态更新时不会更新。是否可以将 TextField 值与来自父级的状态同步?
更新:
我的文本字段
import 'package:flutter/material.dart';
class MyTextField extends StatefulWidget {
final hintText;
final icon;
final keyboardType;
final onTap;
final readOnly;
final text;
const MyTextField(
{this.hintText,
this.icon,
this.keyboardType,
this.onTap,
this.readOnly,
this.text});
@override
_MyTextFieldState createState() => _MyTextFieldState();
}
class _MyTextFieldState extends State<MyTextField> {
TextEditingController textController = TextEditingController();
late FocusNode focusNode = FocusNode();
Color fieldColor = MidneitColors.silverSand200;
void _fieldFocusListener() {
setState(() {
fieldColor = focusNode.hasFocus
? Colors.red
: Colors.blue;
});
}
@override
void initState() {
textController.text = widget.text ?? '';
super.initState();
focusNode.addListener(_fieldFocusListener);
}
@override
void dispose() {
focusNode.removeListener(_fieldFocusListener);
textController.dispose();
focusNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(
const Radius.circular(10)),
boxShadow: [
BoxShadow(
blurRadius: 15,
color: Colors.grey,
spreadRadius: -7,
offset: const Offset(0, 4))
]),
child: TextFormField(
controller: textController,
readOnly: widget.readOnly == null ? false : widget.readOnly,
focusNode: focusNode,
keyboardType: widget.keyboardType,
onTap: widget.onTap,
decoration: InputDecoration(
contentPadding: const EdgeInsets.only(left: 20),
prefixIcon: widget.icon != null
? Icon(widget.icon, size: 18, color: fieldColor)
: null,
fillColor: Colors.white,
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.grey),
borderRadius: BorderRadius.all(
const Radius.circular(10.0))),
focusedBorder: const OutlineInputBorder(
borderSide: const BorderSide(color: Colors.blue),
borderRadius: const BorderRadius.all(
const Radius.circular(10.0))),
hintText: widget.hintText,
),
),
);
}
}
我的主屏幕
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
String city = 'Mos';
void onPressed() {
setState(() {
city = 'St.Peter';
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
padding: const EdgeInsets.all(20),
child: ListView(
children: [
Form(
child: Column(
children: [
MyTextField(
hintText: 'From',
onTap: () => onPressed(),
readOnly: true,
text: city)
],
))
],
),
)));
}
}
你可以使用一个TextEditingController
从_HomeScreenState
。
删除city
字符串,并用控制器替换它:
TextEditingController controller = new TextEditingController(text: 'Mos');
void onPressed() {
setState(() {
controller.text = 'St.Peter';
});
}
将控制器作为参数发送到MyTextField
:
MyTextField(
hintText: 'From',
onTap: () => onPressed(),
readOnly: true,
controller: controller,
)
在里面MyTextField
添加控制器参数:
final TextEditingController controller;
const MyTextField(
{this.hintText,
this.icon,
this.keyboardType,
this.onTap,
this.readOnly,
this.controller});
在状态内部,删除旧的TextEditingController textController
以及与参数相关的所有内容text
。
然后将控制器添加到TextFormField
:
class _MyTextFieldState extends State<MyTextField> {
TextEditingController textController = TextEditingController();
FocusNode focusNode = FocusNode();
Color fieldColor = Colors.grey;
void _fieldFocusListener() {
setState(() {
fieldColor = focusNode.hasFocus
? Colors.red
: Colors.blue;
});
}
@override
void initState() {
super.initState();
focusNode.addListener(_fieldFocusListener);
}
@override
void dispose() {
focusNode.removeListener(_fieldFocusListener);
textController.dispose();
focusNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(
const Radius.circular(10)),
boxShadow: [
BoxShadow(
blurRadius: 15,
color: Colors.grey,
spreadRadius: -7,
offset: const Offset(0, 4))
]),
child: TextFormField(
readOnly: widget.readOnly == null ? false : widget.readOnly,
focusNode: focusNode,
keyboardType: widget.keyboardType,
onTap: widget.onTap,
controller: widget.controller,
decoration: InputDecoration(
contentPadding: const EdgeInsets.only(left: 20),
prefixIcon: widget.icon != null
? Icon(widget.icon, size: 18, color: fieldColor)
: null,
fillColor: Colors.white,
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.grey),
borderRadius: BorderRadius.all(
const Radius.circular(10.0))),
focusedBorder: const OutlineInputBorder(
borderSide: const BorderSide(color: Colors.blue),
borderRadius: const BorderRadius.all(
const Radius.circular(10.0))),
hintText: widget.hintText,
),
),
);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句