我一直在嘗試從/向 Firebase 更新資料,但我遇到了一些問題,當我更新資料時,在 Firestore 中,這些欄位被設定為空值。我該如何解決?
他的錯誤只是在 Armas 物件中發生,AtributeData 中的其余資料很好。
模型
class AtributeData {
final List<int> atributtes;
final List<int> perks;
final List<int> customPerksValue;
final List<String> customPerksName;
final List<Armas> armas;
AtributeData(
{this.atributtes,
this.perks,
this.customPerksName,
this.customPerksValue,
this.armas});
}
class Armas {
final String modelo;
final int numero;
final int preco;
Armas({this.modelo, this.numero, this.preco});
}
當我映射資料和功能以更新 DA 資料時的螢屏
class AtributteDataService {
final String uid;
AtributteDataService({this.uid});
//Referencia para uma Cole??o específica
final CollectionReference atributteSheet =
FirebaseFirestore.instance.collection('atributteSheet');
Future updateAtributteData(
{List<int> atributtes,
List<int> perks,
List<int> customPerksValue,
List<String> customPerksName,
List<Armas> armas,
String modelo,
int numero,
int preco}) async {
return await atributteSheet.doc(uid).set({
'atributtes': atributtes,
'perks': perks,
'customPerksValue': customPerksValue,
'customPerksName': customPerksName,
'armas': [
{
'modelo': modelo,
'numero': numero,
'preco': preco,
}
]
});
}
// retorna um snapshot, mas mapeado para AtributteData
AtributeData _atributteDataFromSnapshot(DocumentSnapshot snapshot) {
return AtributeData(
atributtes: List.from(snapshot['atributtes']),
perks: List.from(snapshot['perks']),
customPerksValue: List.from(snapshot['customPerksValue']),
customPerksName: List.from(snapshot['customPerksName']),
armas: List<Armas>.from(snapshot['armas'].map((e) {
return new Armas(
modelo: e["modelo"],
numero: e["numero"],
preco: e["preco"],
);
}))
// markValue: List.from(snapshot['markValue']),
);
}
//lista de todas as fichas dos usuários retornando em Stream
//Obter Streams do Usuário (sem ser habilidades)
Stream<AtributeData> get atributteData {
return atributteSheet.doc(uid).snapshots().map(_atributteDataFromSnapshot);
}
}
嘗試填寫資料
await AtributteDataService(uid: user.uid).updateAtributteData(
armas: [
Armas(modelo: 'G2', numero: 3, preco: 3200),
Armas(modelo: 'M4A1', numero: 1, preco: 6400),
Armas(modelo: 'AK-47', numero: 5, preco: 7500),
],
customPerksName: [],
customPerksValue: [],
atributtes: [0, 0, 0, 0, 0, 0, 0, 0, 0],
perks: [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
],
);
FIREBASE 影像:由 NULL 填充的欄位
uj5u.com熱心網友回復:
您在使用.set()時沒有明確告訴它將現有欄位與新的更新欄位合并。
要修復它,請告訴 Firestore 通過傳遞將您的新資料與現有資料合并SetOptions:
return await atributteSheet.doc(uid).set({
'atributtes': atributtes,
'perks': perks,
'customPerksValue': customPerksValue,
'customPerksName': customPerksName,
'armas': [
{
'modelo': modelo,
'numero': numero,
'preco': preco,
}
]
}, SetOptions(merge: true));
FlutterFire 檔案中詳細解釋了這方面的更多資訊。
使用 as 時需要小心set,默認情況下,它會將現有記錄的所有內容替換為新記錄。.set()在您想要使用自定義 ID 而不是由 自動生成的新檔案創建新檔案的情況下很有用.add(),最好是,如果您的唯一目標是更新現有檔案中的某些欄位,.update()請改用,并注意:
.update()如果檔案不存在,將失敗。.update()如果您有嵌套資料,則可以使用它,以便提供更好的更新功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/430813.html
上一篇:AndroidStudio:Dart中的錯誤未顯示在螢屏上
下一篇:D3.js彎曲節點標簽
