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

Flutter使用flutter_google_places选中地址后无显示问题求助

问题解决方案

核心问题原因

  • 当前组件使用StatelessWidget实现,修改输入框控制器文本后没有触发UI重绘,且sessionToken、PlaceApiProvider实例都放在build方法中初始化,每次组件重建都会生成新实例,导致状态异常。
  • 部分代码中对suggestion的属性访问方式不一致,若suggestion是对象类型而非Map,用下标['place_id']访问会触发异常,导致后续控制器赋值逻辑不执行。

修复步骤

  1. 将Adresses组件改为StatefulWidget,所有需要持久化的状态(TextEditingController、表单key、接口实例等)都放在State类中初始化,避免放在build方法重复生成。
  2. 控制器文本赋值完成后调用setState触发UI重绘,确保输入框同步展示最新内容。
  3. 统一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:36:05