Flutter TextFormField接收跨页面数据后无法自动展示对应信息
问题:跨页面传入ID后无法自动触发搜索展示数据
我的TextFormField支持手动输入ID编号(custnum)查询并展示对应信息,但从其他页面传入编号后,输入框仅能显示编号,无法自动触发搜索加载数据,必须删除并重新输入至少一个字符才会生效。
搜索函数代码
onSearch(String text) async { if (text.isNotEmpty) { List<Item> itemList = []; for (var item in items) { // 这里先转小写再转大写可简化为text.toUpperCase() if (item.custnum == text.toLowerCase().toUpperCase()) { itemList.add(item); } } setState(() { searchitems.clear(); searchitems.addAll(itemList); // 直接取searchitems[0]会在列表为空时报错,建议加非空判断 print('name : ${searchitems[0].name}'); // if (searchitems.isEmpty) { // searchitems = []; // print('searchitems : ${searchitems[0].address!.length}'); // print('searchitems : ${searchitems[0].address!}'); }); } else { setState(() { searchCus.clear(); searchitems.clear(); // searchitems.addAll(items); print('searchitems : $searchitems'); }); } }
TextFormField代码
TextFormField( initialValue: '${searchCus.isEmpty ? "" : searchCus[widget.indexCus].custnum}', onChanged: onSearch, decoration: InputDecoration( labelText: 'custnum', labelStyle: TextStyle(fontFamily: 'supermarket', fontSize: 14), isDense: true, ), ),
解决方法
- 手动触发初始搜索:
initialValue仅设置输入框初始文本,不会触发onChanged回调。在页面初始化阶段(如initState),若存在传入的有效编号,主动调用onSearch函数:@override void initState() { super.initState(); // 检查是否有传入的有效编号 if (searchCus.isNotEmpty && searchCus[widget.indexCus].custnum.isNotEmpty) { onSearch(searchCus[widget.indexCus].custnum); } } - 优化大小写处理:
text.toLowerCase().toUpperCase()等价于直接转大写,简化为text.toUpperCase()即可,减少冗余操作。 - 增加空值安全判断:在
onSearch中打印searchitems[0].name前,先判断searchitems.isNotEmpty,避免空列表访问下标导致崩溃:if (searchitems.isNotEmpty) { print('name : ${searchitems[0].name}'); }
内容的提问来源于stack exchange,提问作者Ppnncs
相关产品推荐
相关产品推荐

