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

Flutter中TextFormField接收跨页数据无法实时更新问题求助

问题解决方法

核心原因

你更新TextEditingController文本的逻辑没有在widget参数变化时触发——如果只在initState里执行初始赋值,当其他页面传递新的lat/lng时,不会重新执行赋值操作,导致界面无法同步更新。

具体解决方案

1. 确保页面为StatefulWidget

如果当前页面是StatelessWidget,改为StatefulWidget,这样才能通过生命周期方法监听参数变化。

2. 重写didUpdateWidget监听参数更新

在State类中添加该方法,当widget的lat/lng参数变化时,重新同步controller的文本:

@override
void didUpdateWidget(covariant YourPageWidget oldWidget) {
  super.didUpdateWidget(oldWidget);
  // 检测纬度变化并更新
  if (widget.lat != oldWidget.lat && widget.lat != null && widget.lat!.isNotEmpty) {
    lattextController.text = widget.lat!;
    lattextController.selection = TextSelection.collapsed(offset: lattextController.text.length);
  }
  // 检测经度变化并更新
  if (widget.lng != oldWidget.lng && widget.lng != null && widget.lng!.isNotEmpty) {
    lngtextController.text = widget.lng!;
    lngtextController.selection = TextSelection.collapsed(offset: lngtextController.text.length);
  }
}

3. 调整初始赋值逻辑

将初始值赋值放在initState中,保证首次加载时显示初始数据:

@override
void initState() {
  super.initState();
  lattextController = TextEditingController();
  lngtextController = TextEditingController();
  
  if (addr_data != null) {
    lattextController.text = addr_data!.latitude!;
    lngtextController.text = addr_data!.longitude!;
  }
}

4. 优化lngTextFormField方法

移除方法内重复的selection设置,统一在文本更新时处理:

Widget lngTextFormField(String label, String keyword) {
  return TextFormField(
    controller: lngtextController,
    onChanged: (value) {
      saveAd(value, keyword);
    },
    decoration: InputDecoration(
      labelText: label,
      labelStyle: TextStyle(
        fontFamily: 'supermarket',
        fontSize: 16,
      ),
      isDense: true,
    ),
  );
}

额外注意事项

  • 务必在State类中初始化并销毁controller,避免内存泄漏:
late TextEditingController lattextController;
late TextEditingController lngtextController;

@override
void dispose() {
  lattextController.dispose();
  lngtextController.dispose();
  super.dispose();
}

完成以上修改后,当其他页面传递新的经纬度数据时,didUpdateWidget会捕捉到参数变化,自动更新controller文本,TextFormField就能同步显示最新值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:35:30