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

Flutter高级页面传值报错:String无法转Widget,TextFormField不显示数据

问题解决:Flutter中正确传递数据更新TextFormField内容

错误原因

你试图将筛选页面返回的字符串直接赋值给widget.widgetTextField(一个Widget类型变量),类型不匹配导致报错type 'String' is not a subtype of type 'Widget'。TextFormField的显示内容由其绑定的TextEditingController控制,无需替换整个组件,只需更新控制器的文本即可。

解决方案

提供两种可行方案,根据你的代码结构选择:

方案1:通过回调函数通知父组件更新

  1. 修改CreateCQpart1组件的构造函数,添加回调参数:
class CreateCQpart1 extends StatelessWidget {
  final Widget widgetTextField;
  final Function(String) onClientSelected; // 新增回调

  const CreateCQpart1({
    super.key,
    required this.widgetTextField,
    required this.onClientSelected, // 加入参数
  });

  // ... 其他代码
}
  1. 在create_order_page.dart中传入回调实现:
CreateCQpart1(
  widgetTextField: TextFormField(
    enabled: enable,
    keyboardType: TextInputType.number,
    textCapitalization: TextCapitalization.characters,
    controller: controllerNumClient,
    decoration: InputDecoration(border: OutlineInputBorder()),
    onFieldSubmitted: (valor) {
      _findClient();
    },
  ),
  onClientSelected: (clientNumber) {
    // 回调中更新控制器文本
    controllerNumClient.text = clientNumber;
  },
)
  1. 在part1_create_cq.dart中调用回调传递数据:
void _navigateToSearchScreen(BuildContext context) async {
  final result = await Navigator.push(
      context, MaterialPageRoute(builder: (context) => FilterClient()));

  if (result != null) {
    widget.onClientSelected(result); // 触发回调更新文本
  }
}

方案2:直接传递TextEditingController给子组件

  1. 修改CreateCQpart1组件的构造函数,添加控制器参数:
class CreateCQpart1 extends StatelessWidget {
  final Widget widgetTextField;
  final TextEditingController clientController; // 新增控制器参数

  const CreateCQpart1({
    super.key,
    required this.widgetTextField,
    required this.clientController, // 加入参数
  });

  // ... 其他代码
}
  1. 在create_order_page.dart中传入控制器:
CreateCQpart1(
  widgetTextField: TextFormField(
    enabled: enable,
    keyboardType: TextInputType.number,
    textCapitalization: TextCapitalization.characters,
    controller: controllerNumClient,
    decoration: InputDecoration(border: OutlineInputBorder()),
    onFieldSubmitted: (valor) {
      _findClient();
    },
  ),
  clientController: controllerNumClient,
)
  1. 在part1_create_cq.dart中直接更新控制器文本:
void _navigateToSearchScreen(BuildContext context) async {
  final result = await Navigator.push(
      context, MaterialPageRoute(builder: (context) => FilterClient()));

  if (result != null) {
    setState(() {
      widget.clientController.text = result; // 直接更新控制器文本
    });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:43:21