如何根据firestore值返回布尔值



我在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(),
);
}
}),
);
}
}

最新更新