Place Autocomplete (新版)

歐洲經濟區 (EEA) 開發人員

Autocomplete (新版) 服務是 iOS API,可根據要求傳回地點建議。在要求中,指定文字搜尋字串和地理範圍,控管搜尋區域。

Autocomplete (New) 服務可比對輸入內容的完整字詞和子字串,解析地點名稱、地址和 Plus Codes。因此,應用程式可在使用者輸入內容時傳送查詢,即時提供地點建議。

地點建議是根據指定的輸入文字字串和搜尋區域,建議商家、地址和搜尋點等地點。

舉例來說,您可以使用含有部分使用者輸入內容「Spagh」的字串做為輸入內容,呼叫 API,並將搜尋範圍限制在紐約市。回應接著會包含與搜尋字串和搜尋區域相符的地點建議清單,例如名為「Cafe Spaghetti」的餐廳,以及地點的詳細資料。

傳回的地點建議會顯示給使用者,讓他們選取所需地點。您可以提出 Place Details (New) 要求,取得任何傳回地點建議的詳細資訊。

您可以透過兩種主要方式,將 Autocomplete (New) 功能整合到應用程式中:

透過程式輔助方式取得地點預測結果

自動完成 (新版) 要求

GMSPlacesClient 上呼叫方法,建立自動完成要求。您可以在 GMSAutocompleteRequest 物件中傳遞參數。回應會在 GMSAutocompletePlaceSuggestion 物件中提供自動完成建議。

必須提供 API 金鑰和query參數。您也可以加入 GMSAutocompleteSessionToken 將要求與帳單結算期建立關聯,並加入 GMSAutocompleteFilter 將要求套用至結果。

Places Swift SDK 版本

PlacesClient 上呼叫方法,建立自動完成要求。您可以在 AutocompleteRequest 物件中傳遞參數。回應會在 AutocompletePlaceSuggestion 物件中提供自動完成建議。

必須提供 API 金鑰和 query 參數。您也可以加入 AutocompleteSessionToken,將要求與帳單結算期建立關聯,並加入 AutocompleteFilter,將要求套用至結果。

如要進一步瞭解必要和選用參數,請參閱本文的參數部分

Places Swift SDK

let center = (37.3913916, -122.0879074)
let northEast = (37.388162, -122.088137)
let southWest = (37.395804, -122.077023)

let bias = RectangularCoordinateRegion(northEast: northEast, southWest: southWest)
let filter = AutocompleteFilter(types: [ .restaurant ], origin: center, coordinateRegionBias: bias)

let autocompleteRequest = AutocompleteRequest(query: "Sicilian piz", filter: filter)
switch await placesClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let autocompleteSuggestions):
  // Handle suggestions.
case .failure(let placesError):
  // Handle error.
}

Swift

let token = GMSAutocompleteSessionToken()

let northWestBounds = CLLocationCoordinate2DMake(40.921628, -73.700051)
let southEastBounds = CLLocationCoordinate2DMake(40.477398, -74.259087)

let filter = GMSAutocompleteFilter()
filter.types = [kGMSPlaceTypeRestaurant]
filter.locationBias = GMSPlaceRectangularLocationOption(northWestBounds, southEastBounds)

let request = GMSAutocompleteRequest(query:"Spagh")
request.filter = filter
request.sessionToken = token

GMSPlacesClient.shared().fetchAutocompleteSuggestions(from: request, callback: { ( results, error ) in
      if let error = error {
        print("Autocomplete error: \(error)")
        return
      }
      if let autocompleteResults = results {
        for result in autocompleteResults {
          print("Result \(String(describing: result.placeSuggestion?.placeID)) with \(String(describing: result.placeSuggestion?.attributedFullText))")
        }
      }
    })

Objective-C

CLLocationCoordinate2D northEast = CLLocationCoordinate2DMake(37.388162, -122.088137);
CLLocationCoordinate2D southWest = CLLocationCoordinate2DMake(37.395804, -122.077023);

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ kGMSPlaceTypeRestaurant ];
filter.locationBias = GMSPlaceRectangularLocationOption(northEast, southWest);
GMSAutocompleteRequest *request = [[GMSAutocompleteRequest alloc] initWithQuery:@"Sicilian piz"];
request.sessionToken = token;
request.filter = filter;

[[GMSPlacesClient sharedClient] fetchAutocompleteSuggestionsFromRequest:request callback:^(NSArray<GMSAutocompleteSuggestion *> * results, NSError * error){
  // Handle response
  for (GMSAutocompleteSuggestion *suggestion in results) {
    if (suggestion.placeSuggestion) {
      // Show place suggestion data.
    }
  }
}];

自動完成 (新版) 回應

自動完成功能最多會傳回五個 GMSAutocompleteSuggestion 例項的陣列。陣列包含:

  • placeID
  • types:適用於這個地點的類型。
  • distanceMeters:與起點的距離。
  • attributedFullText:建議的完整文字,方便使用者閱讀。
  • attributedPrimaryText:建議中使用者可自然閱讀的主要文字。
  • attributedSecondaryText:建議的次要文字,可供使用者閱讀。
  • structuredFormat:具體名稱和消歧文字,例如城市或區域。

必要參數

查詢

要搜尋的文字字串。指定完整字詞和子字串、地點名稱、地址和 Plus Codes。Autocomplete (New) 服務會根據這個字串傳回候選相符項目,並會依據觀察到的關聯性排序結果。

選用參數

sessionToken

工作階段符記是由使用者產生的字串,可將透過小工具和程式輔助方式發出的 Autocomplete (New) 呼叫,一併追蹤為「工作階段」。自動完成 (新版) 會使用工作階段符記,將使用者自動完成搜尋的查詢和選取階段歸入不同的工作階段,以用於計費。詳情請參閱「工作階段權杖」。

選用的 AutocompleteFilter 參數

類型

一個地點只能有一個主要類型,且必須來自表 A表 B舉例來說,主要類型可能是 mexican_restaurantsteak_house

根據預設,API 會根據 input 參數傳回所有地點,無論與地點相關聯的主要類型值為何。傳送 types 參數,將結果限制為特定主要類型。

使用這個參數,從表 A表 B 指定最多五個類型值。地點必須符合其中一個指定的主要類型值,才會納入回應。

如有下列情況,要求就會遭拒,並傳回 INVALID_REQUEST 錯誤:

  • 指定超過五個類型。
  • 指定任何無法辨識的類型。

舉例來說,如要將結果限制為運動用品店,請在 AutocompleteFilter 中指定該類型:

Places Swift SDK

let filter = AutocompleteFilter(types: [ PlaceType(rawValue: "sporting_goods_store") ])
  

Swift

let filter = GMSAutocompleteFilter()
filter.types = ["sporting_goods_store"]
  

Objective-C

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ "sporting_goods_store" ];

國家/地區

只納入指定區域的結果,最多可指定 15 個 ccTLD (「頂層網域」) 雙字元值,並以陣列形式指定。如果省略這項設定,系統不會對回覆內容套用任何限制。 舉例來說,如要將地區限制為德國和法國,請執行下列操作:

Places Swift SDK

let filter = AutocompleteFilter(countries: ["DE", "FR"])
  

Swift

let filter = GMSAutocompleteFilter()
filter.countries = ["DE", "FR"]

Objective-C

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.countries = @[ @"DE", @"FR" ];

如果同時指定 locationRestrictioncountries,結果會位於這兩項設定的交集區域。

inputOffset

以零為基準的 Unicode 字元位移值,表示 input 中的游標位置。游標位置可能會影響系統傳回的預測結果。如果為空白,則預設為 input 的長度。

locationBias 或 locationRestriction

您可以指定 locationBiaslocationRestriction (但不能同時指定兩者),定義搜尋區域。locationRestriction 可視為指定結果必須位於的區域,locationBias 則可視為指定結果必須靠近的區域,但可位於該區域外。

  • locationBias 會指定要搜尋的區域。這個位置會做為偏誤,也就是說,系統可能會傳回指定位置附近的結果,包括指定區域外的結果。

  • locationRestriction 會指定要搜尋的區域。系統不會傳回指定區域外的結果。

locationBiaslocationRestriction 區域指定為矩形檢視區塊或圓形。

圓形是由中心點和半徑 (以公尺為單位) 所定義。半徑必須介於 0.0 至 50000.0 之間 (含首尾)。預設值為 0.0。如果是 locationRestriction,半徑必須設為大於 0.0 的值。否則要求不會傳回任何結果。

例如:

Places Swift SDK

let center = CLLocationCoordinate2DMake(40.477398, -74.259087)

let bias = CircularCoordinateRegion(center: center, radius: 1000.0)

let filter = AutocompleteFilter(coordinateRegionBias: bias)
  

Swift

let center = CLLocationCoordinate2DMake(40.730610, -73.935242)
let radius = 1000.0

filter.locationBias = GMSPlaceCircularLocationOption(center, radius)

Objective-C

CLLocationCoordinate2D center = CLLocationCoordinate2DMake(40.730610, -73.935242);
radius = 1000.0;

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.locationBias = GMSPlaceCircularLocationOption(center, radius);

矩形是經緯度可視區域,以兩個對角 lowhigh 點表示。可視區域視為封閉區域,因此包含邊界。緯度範圍必須介於 -90 到 90 度之間 (含首尾),經度範圍則必須介於 -180 到 180 度之間 (含首尾):

  • 如果 low = high,可視區域就是該單一點。
  • 如果 low.longitude > high.longitude,經度範圍會反轉 (可視區會跨越 180 度的經度線)。
  • 如果 low.longitude = -180 度且 high.longitude= 180 度,則可視區會包含所有經度。
  • 如果 low.longitude = 180 度且 high.longitude = -180 度,經度範圍會空白。

lowhigh 都必須填入值,且代表的方塊不得為空白。如果檢視區塊為空白,就會發生錯誤。

舉例來說,這個可視區域完全涵蓋紐約市:

Places Swift SDK

let northEast = CLLocationCoordinate2DMake(40.477398, -74.259087)
let southWest = CLLocationCoordinate2DMake(40.921628, -73.700051)

let filter = AutocompleteFilter(coordinateRegionBias: bias)
  

Swift

let high = CLLocationCoordinate2DMake(40.921628, -73.700051)
let low = CLLocationCoordinate2DMake(40.477398, -74.259087)

let filter = GMSAutocompleteFilter()
filter.locationBias = GMSPlaceRectangularLocationOption(high, low)

Objective-C

CLLocationCoordinate2D high = CLLocationCoordinate2DMake(40.477398, -74.259087);
CLLocationCoordinate2D low = CLLocationCoordinate2DMake(440.921628, -73.700051);

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.locationBias = GMSPlaceRectangularLocationOption(high, low);

origin

計算與目的地直線距離的起點 (以 distanceMeters 形式傳回)。如果省略這個值,系統就不會傳回直線距離。必須指定為經緯度座標:

Places Swift SDK

let filter = AutocompleteFilter(origin: CLLocation(latitude: 37.395804, longitude: -122.077023))
  

Swift

let filter = GMSAutocompleteFilter()
filter.origin =  CLLocation(latitude: 37.395804, longitude: -122.077023)
 

Objective-C

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];

filter.origin = [[CLLocation alloc] initWithLatitude:37.395804 longitude: -122.077023];

regionCode

用來格式化回應的區碼,指定為 ccTLD (「頂層網域」) 的兩位字元值。大多數 ccTLD 代碼與 ISO 3166-1 代碼相同,但有一些需要注意的例外情況。舉例來說,英國的 ccTLD 是「uk」(即 .co.uk),而 ISO 3166-1 代碼是「gb」(技術上是指「大不列顛及北愛爾蘭聯合王國」實體)。

如果指定無效的地區代碼,API 會傳回 INVALID_ARGUMENT 錯誤。視適用法律而定,這項參數可能會影響結果。

shouldIncludePureServiceAreaBusinesses

如果為 true,則會在回應陣列中傳回純服務範圍商家。純區域服務商家是指直接為顧客提供送貨或到府服務,但不在商家地址提供服務的商家。

例如:

Places Swift SDK

let filter = AutocompleteFilter()
filter.shouldIncludePureServiceAreaBusinesses = true

Swift

let filter = AutocompleteFilter()
filter.shouldIncludePureServiceAreaBusinesses = true

Objective-C

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.shouldIncludePureServiceAreaBusinesses = YES;

新增 Place Autocomplete 小工具

如要更輕鬆地提供一致的 Place Autocomplete 體驗,您可以將 Place Autocomplete 小工具新增至應用程式。這個小工具提供專用的全螢幕介面,可處理使用者輸入內容、向使用者顯示地點預測結果,並將 AutocompletePlaceSuggestion 物件傳回應用程式。接著,您可以發出 Place Details (New) 要求,取得任何地點預測結果的額外資訊。

地點自動完成小工具

透過程式輔助方式取得地點預測結果時相同,Place Autocomplete 小工具可讓您使用工作階段符記,將自動完成要求分組為工作階段,以用於計費。您可以呼叫 AutocompleteSessionToken() 傳遞工作階段權杖。

如果您未提供工作階段符記,小工具會為您建立 Autocomplete 工作階段符記,然後可從 onSelection 回呼取得。如要進一步瞭解如何使用工作階段符記,請參閱「關於工作階段符記」。

如果 show 繫結值設為 true,系統會將使用者帶往全螢幕檢視畫面,讓他們選取地點。使用者輸入內容時,小工具會傳回地點建議,例如商家、地址和搜尋點。使用者選取地點時,小工具會使用所選地點呼叫 onSelection 處理常式,並關閉全螢幕檢視畫面。

Place Autocomplete 小工具參數

除了可透過程式輔助使用的參數,Place Autocomplete 小工具也提供下列參數。

顯示

show 指定是否顯示小工具。

AutocompleteUICustomization

AutocompleteUICustomization 參數會指定要套用至小工具的 UI 自訂項目。自訂選項包括:

  • AutocompleteListDensity。 這個參數可讓您選擇建議清單的密度,可以是 multiLinetwoLine
  • AutocompleteUIIcon。這個參數可讓您選擇是否要顯示每個清單項目的預設圖示。

onSelection

選取地點時要執行的關閉作業。

onError

發生錯誤時要執行的閉包。如果發生錯誤,系統會傳遞 PlacesError

查看完整程式碼範例

Autocomplete (新版) 範例

使用 locationRestriction 和 locationBias

Autocomplete (新版) 預設會使用 IP 偏誤來控管搜尋區域。使用 IP 偏誤時,API 會使用裝置的 IP 位址來偏誤結果。您可以選擇使用 locationRestrictionlocationBias (但不能同時使用),指定要搜尋的區域。

地點限制會指定搜尋區域。系統不會傳回指定區域外的結果。以下範例使用地點限制,將要求限制為以舊金山為中心、半徑 5000 公尺的圓形地點限制:

Places Swift SDK

let center = (37.775061, -122.419400)
let radius = 5000.0
let restriction = CircularCoordinateRegion(center: center, radius: radius)
let filter = AutocompleteFilter(coordinateRegionRestriction: restriction)
let token = AutocompleteSessionToken()

let autocompleteRequest = AutocompleteRequest(query: "Sicilian piz", sessionToken: token, filter: filter)
switch await placesClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let autocompleteSuggestions):
  for suggestion in autocompleteSuggestions {
    switch suggestion {
    case .place:
      // Show place suggestion data.
    }
  }
case .failure(let placesError):
  // Handle error.
}
  

Swift

let token = GMSAutocompleteSessionToken()

let center = CLLocationCoordinate2DMake(37.775061, -122.419400)
let radius = 5000.0

let filter = GMSAutocompleteFilter()
filter.locationRestriction = GMSPlaceCircularLocationOption(center, radius)

let request = GMSAutocompleteRequest(query:"Piz")
request.filter = filter
request.sessionToken = token

GMSPlacesClient.shared().fetchAutocompleteSuggestions(from: request, callback: { ( results, error ) in
      if let error = error {
        print("Autocomplete error: \(error)")
        return
      }
      if let autocompleteResults = results {
        for result in autocompleteResults {
          print("Result \(String(describing: result.placeSuggestion?.placeID)) with \(String(describing: result.placeSuggestion?.attributedFullText))")
        }
      }
    })

Objective-C

CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37.775061, -122.419400);
radius = 5000.0;

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.locationRestriction = GMSPlaceCircularLocationOption(center, radius);
GMSAutocompleteRequest *request = [[GMSAutocompleteRequest alloc] initWithQuery:@"Sicilian piz"];
request.sessionToken = token;
request.filter = filter;

[[GMSPlacesClient sharedClient] fetchAutocompleteSuggestionsFromRequest:request callback:^(NSArray<GMSAutocompleteSuggestion *> * results, NSError * error){
  // Handle response
  for (GMSAutocompleteSuggestion *suggestion in results) {
    if (suggestion.placeSuggestion) {
      // Show place suggestion data.
    }
  }
}];

位置偏向設定會將位置當做偏向,也就是說,系統可能會傳回指定位置附近的結果,包括指定區域外的結果。下一個範例會變更先前的要求,改為使用位置偏誤:

Places Swift SDK

let center = (37.775061, -122.419400)
let radius = 5000.0
let bias = CircularCoordinateRegion(center: center, radius: radius)
let filter = AutocompleteFilter(coordinateRegionBias: bias)
let token = AutocompleteSessionToken()

let autocompleteRequest = AutocompleteRequest(query: "Sicilian piz", sessionToken: token, filter: filter)
switch await placesClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let autocompleteSuggestions):
  for suggestion in autocompleteSuggestions {
    switch suggestion {
    case .place:
      // Show place suggestion data.
    }
  }
case .failure(let placesError):
  // Handle error.
}
  

Swift

let token = GMSAutocompleteSessionToken()

let center = CLLocationCoordinate2DMake(37.775061, -122.419400)
let radius = 5000.0

let filter = GMSAutocompleteFilter()
filter.locationBias = GMSPlaceCircularLocationOption(center, radius)

let request = GMSAutocompleteRequest(query:"Piz")
request.filter = filter
request.sessionToken = token

GMSPlacesClient.shared().fetchAutocompleteSuggestions(from: request, callback: { ( results, error ) in
      if let error = error {
        print("Autocomplete error: \(error)")
        return
      }
      if let autocompleteResults = results {
        for result in autocompleteResults {
          print("Result \(String(describing: result.placeSuggestion?.placeID)) with \(String(describing: result.placeSuggestion?.attributedFullText))")
        }
      }
    })

Objective-C

CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37.775061, -122.419400);
radius = 5000.0;

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.locationBias = GMSPlaceCircularLocationOption(center, radius);
GMSAutocompleteRequest *request = [[GMSAutocompleteRequest alloc] initWithQuery:@"Sicilian piz"];
request.sessionToken = token;
request.filter = filter;

[[GMSPlacesClient sharedClient] fetchAutocompleteSuggestionsFromRequest:request callback:^(NSArray<GMSAutocompleteSuggestion *> * results, NSError * error){
  // Handle response
  for (GMSAutocompleteSuggestion *suggestion in results) {
    if (suggestion.placeSuggestion) {
      // Show place suggestion data.
    }
  }
}];

用途類型

使用 types 參數,將要求結果限制為表 A表 B 中列出的特定類型。您最多可以指定五個值的陣列。如果省略,系統會傳回所有類型。

以下範例指定「Soccer」的查詢字串,並使用 types 參數將結果限制為 "sporting_goods_store" 類型的場所:

Places Swift SDK

let filter = AutocompleteFilter(types: [ PlaceType(rawValue: "sporting_goods_store") ])
let token = AutocompleteSessionToken()

let autocompleteRequest = AutocompleteRequest(query: "Soccer", sessionToken: token, filter: filter)
switch await placesClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let autocompleteSuggestions):
  for suggestion in autocompleteSuggestions {
    switch suggestion {
    case .place:
      // Show place suggestion data.
    }
  }
case .failure(let placesError):
  // Handle error.
}
    

Swift

let token = GMSAutocompleteSessionToken()

let filter = GMSAutocompleteFilter()
filter.types = ["sporting_goods_store"]

let request = GMSAutocompleteRequest(query:"Soccer")
request.filter = filter
request.sessionToken = token

GMSPlacesClient.shared().fetchAutocompleteSuggestions(from: request, callback: { ( results, error ) in
      if let error = error {
        print("Autocomplete error: \(error)")
        return
      }
      if let autocompleteResults = results {
        for result in autocompleteResults {
          print("Result \(String(describing: result.placeSuggestion?.placeID)) with \(String(describing: result.placeSuggestion?.attributedFullText))")
        }
      }
    })

Objective-C

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ "sporting_goods_store" ];
GMSAutocompleteRequest *request = [[GMSAutocompleteRequest alloc] initWithQuery:@"Soccer"];
request.sessionToken = token;
request.filter = filter;

[[GMSPlacesClient sharedClient] fetchAutocompleteSuggestionsFromRequest:request callback:^(NSArray<GMSAutocompleteSuggestion *> * results, NSError * error){
  // Handle response
  for (GMSAutocompleteSuggestion *suggestion in results) {
    if (suggestion.placeSuggestion) {
      // Show place suggestion data.
    }
  }
}];

使用來源

在要求中加入 origin 參數 (指定為經緯度座標) 時,API 會在回應中加入從起點到目的地的直線距離。回應會以 distanceMeters 形式傳回距離。

這個範例將原點設為舊金山中心:

Places Swift SDK

let filter = AutocompleteFilter(origin: CLLocation(latitude: 37.7749, longitude: -122.4194))
let token = AutocompleteSessionToken()

let autocompleteRequest = AutocompleteRequest(query: "Amoeba", sessionToken: token, filter: filter)
switch await placesClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let autocompleteSuggestions):
  for suggestion in autocompleteSuggestions {
    switch suggestion {
    case .place:
      // Show place suggestion data.
    }
  }
case .failure(let placesError):
  // Handle error.
}
  

Swift

let token = GMSAutocompleteSessionToken()

let origin = CLLocation(latitude: 37.7749, longitude: -122.4194)

let filter = GMSAutocompleteFilter()

filter.origin =  origin

let request = GMSAutocompleteRequest(query:"Amoeba")
request.filter = filter
request.sessionToken = token

GMSPlacesClient.shared().fetchAutocompleteSuggestions(from: request, callback: { ( results, error ) in
      if let error = error {
        print("Autocomplete error: \(error)")
        return
      }
      if let autocompleteResults = results {
        for result in autocompleteResults {
          print("Result \(String(describing: result.placeSuggestion?.placeID)) with \(String(describing: result.placeSuggestion?.attributedFullText)) and distance: \(String(describing: result.placeSuggestion?.distanceMeters))")
        }
      }
    })

Objective-C

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.origin = [[CLLocation alloc] initWithLatitude:37.395804 longitude:-122.077023];
GMSAutocompleteRequest *request = [[GMSAutocompleteRequest alloc] initWithQuery:@"Amoeba"];
request.sessionToken = token;
request.filter = filter;

[[GMSPlacesClient sharedClient] fetchAutocompleteSuggestionsFromRequest:request callback:^(NSArray<GMSAutocompleteSuggestion *> * results, NSError * error){
  // Handle response
  for (GMSAutocompleteSuggestion *suggestion in results) {
    if (suggestion.placeSuggestion) {
      // Show place suggestion data.
      }
    }
}];

新增 Place Autocomplete 小工具

Places Swift SDK

struct PlaceAutocompleteDemoView: View {

  @State private var fetchedPlace: Place?
  @State private var placesError: PlacesError?
  @State private var showWidget = false

  public var body: some View {
    VStack {
      Button("Search for a place") {
        showWidget.toggle()
      }
      .placeAutocomplete(
        show: $showWidget,
        onSelection: { (autocompletePlaceSuggestion, autocompleteSessionToken) in
          Task {
            let placesClient = await PlacesClient.shared
            let fetchPlaceRequest = FetchPlaceRequest(
              placeID: autocompletePlaceSuggestion.placeID,
              placeProperties: [.displayName, .formattedAddress],
              sessionToken: autocompleteSessionToken
            )

            switch await placesClient.fetchPlace(with: fetchPlaceRequest) {
            case .success(let place):
              print("Fetched place: \(place)")
              self.fetchedPlace = place
            case .failure(let placesError):
              print("Failed to fetch place: \(placesError)")
              self.placesError = placesError
            }
          }
        },
        onError: { placesError in
          self.placesError = placesError
        }
      )
    }
  }
}