У меня есть код ниже, который читает baby
имя и голосование от firestore
и представляет информацию в Cards
с помощью кнопок thump_up и thump_down.
Данные обновляются при изменениях в базе данных пожарной базы, но они обновляются неправильно, например, на снимке экрана ниже, сначала я ввел Karam
данные ребенка, и они обновляются правильно, затем я ввел данные ребенка «Дана» , но он создал еще одну карту с Karam
данными о ребенке (то есть, ту же, что была создана до него), но при вводе Yara
данных о ребенке, здесь была создана правильная карта! Я думаю, потому что это в конце списка!
Кроме того, на последнем снимке экрана я удалил запись для Dana
baby из базы данных, но была удалена последняя созданная карта, предназначенная для Yara
baby !!
То же самое, когда мы нажимаем значок thumb_up
, голос обновляется в базе данных, но не отражается в карточке: (
main.dart
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'BabyModel.dart';
import 'BabyCard.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
MyApp();
@override
State<StatefulWidget> createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
@override
Widget build(BuildContext ctxt) {
return StreamBuilder(
stream: Firestore.instance.collection('baby').snapshots(),
builder: (_, AsyncSnapshot<QuerySnapshot> snapshot) {
var documents = snapshot.data?.documents ?? [];
var baby =
documents.map((snapshot) => BabyData.from(snapshot)).toList();
return BabyPage(baby);
},
);
}
}
class BabyPage extends StatefulWidget {
final List<BabyData> allBaby;
BabyPage(this.allBaby);
@override
State<StatefulWidget> createState() {
return BabyPageState();
}
}
class BabyPageState extends State<BabyPage> {
@override
Widget build(BuildContext context) {
// var filteredBaby = widget.allFish.where((BabyData data) {
// data.name = 'Dana';
// }).toList();
return MaterialApp(
debugShowCheckedModeBanner: false,
home: SafeArea(
child: Scaffold(
body: Container(
child: ListView.builder(
itemCount: widget.allBaby.length,
padding: const EdgeInsets.only(top: 10.0),
itemBuilder: (context, index) {
return BabyCard(widget.allBaby[index]);
})
),
)));
}
}
BabyModel.dart
:
import 'package:cloud_firestore/cloud_firestore.dart';
class BabyData {
final DocumentReference reference;
String name;
int vote;
BabyData.data(this.reference,
[this.name,
this.vote]) {
// Set these rather than using the default value because Firebase returns
// null if the value is not specified.
this.name ??= 'Frank';
this.vote ??= 7;
}
factory BabyData.from(DocumentSnapshot document) => BabyData.data(
document.reference,
document.data['name'],
document.data['vote']);
void save() {
reference.setData(toMap());
}
Map<String, dynamic> toMap() {
return {
'name': name,
'vote': vote,
};
}
}
BabyCard.dart
import 'package:flutter/material.dart';
import 'BabyModel.dart';
class BabyCard extends StatefulWidget {
final BabyData baby;
BabyCard(this.baby);
@override
State<StatefulWidget> createState() {
return BabyCardState(baby);
}
}
class BabyCardState extends State<BabyCard> {
BabyData baby;
String renderUrl;
BabyCardState(this.baby);
Widget get babyCard {
return
new Card(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
leading: const Icon(Icons.album),
title: Text('The ${baby.name} is having:'),
subtitle: Text('${baby.vote} Votes.'),
),
new ButtonTheme.bar( // make buttons use the appropriate styles for cards
child: new ButtonBar(
children: <Widget>[
new FlatButton(
child: const Icon(Icons.thumb_up),
onPressed: () => Firestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap =
await transaction.get(baby.reference);
await transaction.update(
freshSnap.reference, {'vote': freshSnap['vote'] + 1});
}),
),
new FlatButton(
child: const Icon(Icons.thumbs_up_down),
onPressed: () { /* ... */ },
),
new FlatButton(
child: const Icon(Icons.thumb_down),
onPressed: () { /* ... */ },
)]))]));
}
@override
Widget build(BuildContext context) {
return new Container(
child: babyCard,
);
}
}
Ниже показаны неправильные данные, добавляемые в карту, Dana
ребенка там нет:
Ниже показано неправильное удаление данных с карты, Yara
карта ребенка была удалена, при удалении Dana
записи ребенка!: