You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter返回上一屏幕后如何刷新数据?购物车地址更新UI不变更问题

问题根因

  • TextFormField的initialValue属性仅在组件首次构建挂载时生效,后续即使通过setState更新了address变量的值,已渲染的TextFormField也不会重新读取initialValue更新展示内容。
  • 你代码中setState已经触发了页面重建(控制台会打印Rebuild cart),只是TextFormField本身没有响应值的变化。

解决方案

推荐使用绑定TextEditingController的方式实现值同步,操作步骤如下:

  1. 在_CartScreenState类中声明对应的控制器
class _CartScreenState extends State<CartScreen> {
   Future _addressFuture;
   String value = 'deliver';
   var address;
   // 新增控制器
   final TextEditingController _nameController = TextEditingController();
  1. 首次获取地址时给控制器赋值,修改_obtainAddressFuture方法
Future _obtainAddressFuture() async {
  address = await Provider.of<Addresses>(context, listen: false).fetchMyAddress();
  // 给控制器赋值
  _nameController.text = address.name;
}
  1. 从地址页返回更新地址时,同步修改控制器的内容
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); 
}
  1. 修改TextFormField配置,替换initialValue为控制器
TextFormField(
  // 删掉initialValue配置,换成controller
  controller: _nameController,
  readOnly: true,
  decoration: InputDecoration(
      border: InputBorder.none,
      prefixIcon: Icon(Icons.person,
          color: Colors.orangeAccent),
      labelText: 'Contact name'),
),
  1. 在页面销毁时释放控制器,避免内存泄漏
@override
void dispose() {
  _nameController.dispose();
  super.dispose();
}

如果你有多个地址字段(比如联系电话、详细地址等),按照上述逻辑给每个字段单独声明对应的TextEditingController同步值即可。

内容的提问来源于stack exchange,提问作者mcfred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:15:07