我在firestore中有一个布尔值,我需要根据这个布尔值设置一个条件。我试图从firestore中获取这个布尔值,然后在我的futurebuilder中使用它,但即使我能在firestore中看到值,我也总是得到null。请帮忙。
Future<bool> getUser() async {
dynamic data;
bool isUser=false;
final DocumentReference document =
FirebaseFirestore.instance.collection('users').doc(uida).collection('pre').doc();
isUser = await document.get().then<dynamic>(( DocumentSnapshot snapshot) async{
data =snapshot.data;
final data1 = data.map((doc) => doc['enrolled']);
print(data1.toString());
if (data1==true){
setState(() {
isUser = true;
});}
});
return isUser;
}
小工具
return FutureBuilder(
future: getUser(),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.data == true)
return Text(snapshot.data.toString());
使用异步代码时,最好使用async和wait,或者使用then。在您的情况下,async和await将提供更可读的代码。
对于您的getUser函数,这将类似于:
Future<bool> getUser() async {
dynamic data;
bool isUser=false;
final DocumentReference document =
FirebaseFirestore.instance.collection('users').doc(uida).collection('pre').doc();
isUser = await document.get()
data = snapshot.data;
final data1 = data['enrolled'];
print(data1.toString());
if (data1==true){
setState(() {
isUser = true;
});}
});
return data1;
}
对于Futurebuilder来说,最好使用snapshot.hasData来检查快照是否包含数据,如下所示:
return FutureBuilder(
future: getUser(),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.hasData)
if (snapshot.data ==true){
return Text(snapshot.data.toString());
} else {
return Text('still waiting for data...')
请参阅https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html以获得更好的解释。
您可以使用下面的代码来解决您的问题,但要检查两件事:您是否拥有从firebase获取数据所需的所有权限,以及检查文档id是否正确?您可以使用if(snapshot.data!.exists)来检查文档是否存在于当前集合中
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
class TestClass extends StatefulWidget {
const TestClass({Key? key}) : super(key: key);
@override
_TestClassState createState() => _TestClassState();
}
class _TestClassState extends State<TestClass> {
final _auth = FirebaseAuth.instance;
final FirebaseFirestore _fireStore = FirebaseFirestore.instance;
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<DocumentSnapshot>(
future: _fireStore
.collection('users').doc(uida).collection('pre').doc(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Center(child: Text(snapshot.data!['enrolled'].toString()));
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}),
);
}
}