簡體   English   中英

如何在 SwiftUI 中使用用戶當前位置調用 API?

[英]How can I call an API with user's current location on app launch in SwiftUI?

我正在嘗試使用用戶當前位置在應用啟動時調用 API。 我目前的代碼是:

ContentView.swift 中

struct ContentView: View {
    
    @StateObject var locationManager = LocationManager()
    
    var userLocation: String {
        let latitude = "\(locationManager.lastLocation?.coordinate.latitude ?? 0)"
        let longitude = "\(locationManager.lastLocation?.coordinate.longitude ?? 0)"
        return "\(latitude),\(longitude)"
    }
    
    @ObservedObject var api = randomAPI(location: userLocation)

    var body: some View {
        ...

randomAPI.swift 中

class randomAPI: ObservableObject {
    
    init(location: String) {
        callAPI(userLocation: location)
    }
    
    func callAPI(userLocation: String) {
        ...

我得到了錯誤:
不能在屬性初始化器中使用實例成員“userLocation”; 屬性初始化程序在 'self' 可用之前運行。

我不知道我應該把下面的行放在哪里來初始化randomAPI。 (實際上我什至不知道這是否是初始化它的正確方法哈哈)

@ObservedObject var api = randomAPI(location: userLocation)

有人可以幫我解決這個問題嗎? 謝謝!

正如Joakim提到的,您需要使用.onAppear 這是因為在結構中設置屬性之前,您無法訪問該屬性。

對於您的情況,代碼如下所示:

struct ContentView: View {
    
    @StateObject var locationManager = LocationManager()
    
    var userLocation: String {
        let latitude = "\(locationManager.lastLocation?.coordinate.latitude ?? 0)"
        let longitude = "\(locationManager.lastLocation?.coordinate.longitude ?? 0)"
        return "\(latitude),\(longitude)"
    }
    
    @ObservedObject var api: randomAPI?

    var body: some View {
        SomeView()
            .onAppear {
                api = randomAPI(location: userLocation)
            }
...

但是,我不認為在視圖出現后立即設置ObservedObject是最好的方法。

如果我是你,我會刪除rapidAPI class 中的 init 方法:

class randomAPI: ObservableObject {
    func callAPI(userLocation: String) {
        ...

並在視圖出現時調用callAPI方法:

struct ContentView: View {
    
    @StateObject var locationManager = LocationManager()
    
    var userLocation: String {
        let latitude = "\(locationManager.lastLocation?.coordinate.latitude ?? 0)"
        let longitude = "\(locationManager.lastLocation?.coordinate.longitude ?? 0)"
        return "\(latitude),\(longitude)"
    }
    
    @ObservedObject var api = randomAPI()

    var body: some View {
        SomeView()
            .onAppear {
                api.callAPI(location: userLocation)
            }
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM