我有一個專案的現有 Firestore 資料庫。在給定的集合(比如“用戶”)中,我在每個檔案中都有用戶組態檔資訊。
在某些檔案中,集合中有欄位“signupMethod”,而同一集合中的其他一些檔案中不存在相同的欄位。
我需要嘗試為我的應用程式中的每個用戶會話讀取 signupMethod。如果檔案確實有該欄位,則需要使用該欄位的值。如果相應用戶檔案的欄位不存在,我想將其設定為“電子郵件”的默認值。
我嘗試以下方法:
try {
if (snapshot.data().containsKey("signupMethod")) {
wpUserProfile.signupMethod = snapshot.data["signupMethod"];
} else {
wpUserProfile.signupMethod = "Email";
}
} on Exception catch (_) {
wpUserProfile.signupMethod = "Email";
}
但它給出了以下錯誤:
Exception has occurred.
NoSuchMethodError (NoSuchMethodError: Class '_JsonDocumentSnapshot' has no instance method 'call'.
Receiver: Instance of '_JsonDocumentSnapshot'
Tried calling: call())
我改為嘗試以下操作:
try {
wpUserProfile.signupMethod = snapshot.data["signupMethod"];
} on Exception catch (_) {
wpUserProfile.signupMethod = "Email";
}
這次我收到以下錯誤:
Exception has occurred.
StateError (Bad state: field does not exist within the DocumentSnapshotPlatform)
我不明白為什么它不運行例外塊中的代碼并將其設定為“電子郵件”。
有誰知道從 Firestore 讀取一個欄位時我應該如何處理這種情況,該欄位可能存在也可能不存在于帶有顫動的給定檔案中?
附錄:(回答下面彼得的問題)
如果我列印出來snapshot.data,我會得到以下輸出:
flutter: Instance of '_JsonDocumentSnapshot'
如果我列印出來snapshot.data(),我會收到以下錯誤:
[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: NoSuchMethodError: Class '_JsonDocumentSnapshot' has no instance method 'call'.
Receiver: Instance of '_JsonDocumentSnapshot'
Tried calling: call()
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:63:5)
#1 _UserDataProviderState._setUserProfileData
package:wp/widgets/user_data_provider.dart:76
#2 _UserDataProviderState.build.<anonymous closure>
package:wp/widgets/user_data_provider.dart:135
#3 _FutureBuilderState.build
package:flutter/…/widgets/async.dart:782
#4 StatefulElement.build
package:flutter/…/widgets/framework.dart:4782
#5 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4665
#6 StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4840
#7 Element.rebuild
package:flutter/…/widgets/framework.dart:4355
#8 BuildOwner.buildScope
package:flutter/…/widgets/framework.dart:2620
#9 WidgetsBinding.drawFrame
package:flutter/…/widgets/binding.dart:882
#10 RendererBinding._handlePersistentFrameCallback
package:flutter/…/rendering/binding.dart:319
#11 SchedulerBinding._invokeFrameCallback
package:flutter/…/scheduler/binding.dart:1143
#12 SchedulerBinding.handleDrawFrame
package:flutter/…/scheduler/binding.dart:1080
#13 SchedulerBinding._handleDrawFrame
package:flutter/…/scheduler/binding.dart:996
#14 _rootRun (dart:async/zone.dart:1428:13)
#15 _CustomZone.run (dart:async/zone.dart:1328:19)
#16 _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
#17 _invoke (dart:ui/hooks.dart:166:10)
#18 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:270:5)
#19 _drawFrame (dart:ui/hooks.dart:129:31)
如果我只是 print out snapshot.data["email"],我會得到以下輸出:
testuser@testuser.com
uj5u.com熱心網友回復:
在你的情況下,我假設它snapshot包含一個AsyncSnapshot物件。根據檔案,它有一個data屬性。這可以null,因此始終建議在處理結果之前檢查hasData/hasError屬性。
所以一旦你確定它不為空,snapshot.data!就會包含你的結果AsyncSnapshot,在這種情況下,這是一個DocumentSnapshot.
查看檔案,DocumentSnapshot有一個data()方法可以保存檔案本身。所以最終snapshot.data!.data()將成為您的檔案,您可以從中獲取欄位,例如:
snapshot.data!.data()["signupMethod"], 或者snapshot.data!.data().get("signupMethod")- (如果您需要
id檔案的 ,它將在snapshot.data!.id)
在這兩種情況下,null如果該欄位不存在,您都會得到,因此您不需要containsKey.
重要提示:請務必檢查是否snapshot.data!.exists為true,因為即使找不到您要查找的資料,Firestore 也會為您提供檔案快照。如果exists是true,您可以按照上述方法進行操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/346688.html
標籤:火力基地 扑 镖 谷歌云firestore
上一篇:如何為每個類別創建自定義選項?
