您可以使用类似于 BloC 模式的东西在 StreamBuilder 上实现 Firebase 实时数据库。
首先为您的卡片信息创建一个模型。您还可以在同一个类中包含 json 解析器。
class CardInfo{
String? cvv;
String? cardHolder;
String? number;
String? expiry;
CardInfo({this.cvv, this.cardHolder,
this.number, this.expiry});
factory CardInfo.fromJson({required Map<dynamic,dynamic> json}){
return CardInfo(
cvv: json['CVV'],
cardHolder: json['Card Holder'],
number: json['Credit Card Number'],
expiry: json['Expiry Date'],
);
}
}
在 Bloc 类中添加您的 Streams
class Bloc {
final _repository = Repository();
final _cardInfoFetcher = StreamController<CardInfo>.broadcast();
/// The Stream that will be used on StreamBuilder
Stream<CardInfo> get userCardInfo => _cardInfoFetcher.stream;
fetchUserThreads(String? userId) async {
var cardInfo = CardInfo();
/// Query user card details
var userCardDetails = FirebaseDatabase.instance.reference().child('Users').child(userId)
.child('Card Info');
/// Fetch user card details once
var snapshot = await userCardDetails.once();
Map<dynamic, dynamic> userCardSnapshot = snapshot.value;
_cardInfoFetcher.sink.add(CardInfo.fromJson(json: userCardSnapshot));
}
/// Dispose Stream when not in use
dispose() {
_cardInfoFetcher.close();
}
}
final bloc = Bloc();
每次调用bloc.fetchUserThreads(String) 时,StreamBuilder 都应该重新构建小部件。
StreamBuilder<CardInfo>(
stream: bloc.userCardInfo,
builder: (BuildContext context,
AsyncSnapshot<CardInfo> snapshot) {
if (!snapshot.hasData)
debugPrint('Snapshot empty');
else {
debugPrint('Card Holder: ${snapshot.data!.cardHolder}');
}
/// You can now populate child widget with CardInfo data from the snapshot
return Container();
}
)