Flutter返回上一屏幕后如何刷新数据?购物车地址更新UI不变更问题
问题根因
TextFormField的initialValue属性仅在组件首次构建挂载时生效,后续即使通过setState更新了address变量的值,已渲染的TextFormField也不会重新读取initialValue更新展示内容。- 你代码中
setState已经触发了页面重建(控制台会打印Rebuild cart),只是TextFormField本身没有响应值的变化。
解决方案
推荐使用绑定TextEditingController的方式实现值同步,操作步骤如下:
- 在
_CartScreenState类中声明对应的控制器
class _CartScreenState extends State<CartScreen> { Future _addressFuture; String value = 'deliver'; var address; // 新增控制器 final TextEditingController _nameController = TextEditingController();
- 首次获取地址时给控制器赋值,修改
_obtainAddressFuture方法
Future _obtainAddressFuture() async { address = await Provider.of<Addresses>(context, listen: false).fetchMyAddress(); // 给控制器赋值 _nameController.text = address.name; }
- 从地址页返回更新地址时,同步修改控制器的内容
void _awaitReturnValueFromSecondScreen(BuildContext context) async { final result = await Navigator.push( context, MaterialPageRoute( builder: (context) => AddressScreen('cartScreen'), )); setState(() { address = result; // 同步更新控制器的值 _nameController.text = result.name; }); print(address.name); }
- 修改
TextFormField配置,替换initialValue为控制器
TextFormField( // 删掉initialValue配置,换成controller controller: _nameController, readOnly: true, decoration: InputDecoration( border: InputBorder.none, prefixIcon: Icon(Icons.person, color: Colors.orangeAccent), labelText: 'Contact name'), ),
- 在页面销毁时释放控制器,避免内存泄漏
@override void dispose() { _nameController.dispose(); super.dispose(); }
如果你有多个地址字段(比如联系电话、详细地址等),按照上述逻辑给每个字段单独声明对应的TextEditingController同步值即可。
内容的提问来源于stack exchange,提问作者mcfred
相关产品推荐
相关产品推荐

