Flutter使用flutter_google_places选中地址后无显示问题求助
问题解决方案
核心问题原因
- 当前组件使用
StatelessWidget实现,修改输入框控制器文本后没有触发UI重绘,且sessionToken、PlaceApiProvider实例都放在build方法中初始化,每次组件重建都会生成新实例,导致状态异常。 - 部分代码中对suggestion的属性访问方式不一致,若suggestion是对象类型而非Map,用下标
['place_id']访问会触发异常,导致后续控制器赋值逻辑不执行。
修复步骤
- 将
Adresses组件改为StatefulWidget,所有需要持久化的状态(TextEditingController、表单key、接口实例等)都放在State类中初始化,避免放在build方法重复生成。 - 控制器文本赋值完成后调用
setState触发UI重绘,确保输入框同步展示最新内容。 - 统一suggestion的属性访问方式,避免类型错误。
修复后参考代码
import 'package:flutter/material.dart'; // 其他原有导入保持不变 class Adresses extends StatefulWidget { const Adresses({Key key, this.user}) : super(key: key); final UsersInformations user; @override State<Adresses> createState() => _AdressesState(); } class _AdressesState extends State<Adresses> { final TextEditingController adresse = TextEditingController(); final _formKey = GlobalKey<FormState>(); String sessionToken; PlaceApiProvider places_provider; @override void initState() { super.initState(); // 初始化逻辑放在initState,避免build时重复生成 sessionToken = const Uuid().v4(); places_provider = PlaceApiProvider(sessionToken); } @override void dispose() { // 及时销毁控制器避免内存泄漏 adresse.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Container( child: Form( key: _formKey, child: TypeAheadFormField( suggestionsCallback: (pattern) async { return await places_provider.fetchSuggestions(pattern, 'fr'); }, itemBuilder: (context, suggestion) { return ListTile( title: Text(suggestion.description), ); }, onSuggestionSelected: (suggestion) async { // 确认属性访问方式正确,如果suggestion是对象就用.访问,是Map才用[] Place places_details = await places_provider .getPlaceDetailFromId(suggestion.place_id); setState(() { adresse.text = suggestion.description; }); widget.user.setstreetNumber = places_details.streetNumber; widget.user.setstreet = places_details.street; widget.user.setcity = places_details.city; widget.user.setzipCode = places_details.zipCode; widget.user.setgeopoint = places_details.geopoint; print(adresse.text); }, getImmediateSuggestions: true, hideSuggestionsOnKeyboardHide: false, hideOnEmpty: false, noItemsFoundBuilder: (context) => const Padding( padding: EdgeInsets.all(8), child: Text('No Item Found'), ), textFieldConfiguration: TextFieldConfiguration( decoration: InputDecoration( enabledBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.grey.shade300)), focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.deepPurple.shade900)), focusedErrorBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.red.shade900)), errorBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.red.shade900)), hintText: "Adresses", ), controller: adresse, ), ), ), ); } }
内容的提问来源于stack exchange,提问作者Yanis Belazzoug
相关产品推荐
相关产品推荐

