#flutter #google-cloud-firestore
# #флаттер #google-облако-firestore
Вопрос:
в моем приложении Flutter мне нужно получить массив данных из Firestore с помощью uid, но ни один из моих вариантов кода не работает так, как я хочу.
Вот мои коды:
Когда я использую это, я не могу получить какие-либо данные из Firestore
Future<List<DocumentSnapshot>> getData() async {
final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final uid = user.uid;
var firestore = FirebaseFirestore.instance;
QuerySnapshot qn = await firestore
.collection("users")
.where("user" , isEqualTo: uid).get();
return qn.docs;
}
Когда я изменяю код таким образом, я могу получить массивы всех пользователей.
Но я не хочу получать данные всех пользователей — я просто хочу взять массивы текущего пользователя.
Как я могу это сделать?
Future<List<DocumentSnapshot>> getData() async {
final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final uid = user.uid;
var firestore = FirebaseFirestore.instance;
QuerySnapshot qn = await firestore
.collection("users")
.get();
return qn.docs;
}
именно так я принимаю значения:
@override
Widget build(BuildContext context) {
final _width = MediaQuery
.of(context)
.size
.width;
final _height = MediaQuery
.of(context)
.size
.height;
return Scaffold(
body: FutureBuilder(
future: getData(),
builder: (_, AsyncSnapshot<List<DocumentSnapshot>> snapshot) {
if(snapshot.hasData){
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (_, index) {
return Column(
children: [
Card(
child: SingleChildScrollView(
child: Column(
children: [
Container(
alignment: Alignment.center,
color: Colors.black,
height: 50, width: _width/2,
child: Text(
snapshot.data[index].data()["arrayData"][index]["doOne"].toString(),
style: TextStyle(color: Colors.white,fontSize: 24),)),
Container(
alignment: Alignment.center,
color: Colors.black,
height: 50, width: _width/2,
child: Text(
snapshot.data[index].data()["arrayData"][index]["doTwo"].toString(),
style: TextStyle(color: Colors.white,fontSize: 24),)),
],
),
),
),
],
);
}
);
}
return CircularProgressIndicator();
}
),
);
}
Комментарии:
1. Можете ли вы отредактировать свой вопрос, чтобы показать скриншот документа / a, который, как вы ожидаете, вернет запрос?
Ответ №1:
Попробуйте это:
QuerySnapshot qn = await firestore.collection("users").doc(uid).get();
Комментарии:
1. Когда я меняюсь подобным образом, flutter хочет изменить QuerySnapshot на DocumentSnapshot
2. qn.data() насколько я помню, ваша среда разработки должна давать вам рекомендации
3. Или qn.doc.data()
4. Я попробовал оба из них, но IDE не дал никаких предложений: D
Ответ №2:
Я исправил эту проблему следующим образом
class ListScreenTwo extends StatelessWidget {
@override
Widget build(BuildContext context) {
final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final uid = user.uid;
// get the course document using a stream
Stream<DocumentSnapshot> courseDocStream = FirebaseFirestore.instance
.collection('users')
.doc(uid)
.snapshots();
return Scaffold(
body: Container(
alignment: Alignment.center,
height: 400, width: 300,
child: StreamBuilder<DocumentSnapshot>(
stream: courseDocStream,
builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
var courseDocument = snapshot.data.data;
var sections = courseDocument()['arrayData'];
// build list using names from sections
return ListView.builder(
itemCount: sections != null ? sections.length : 0,
itemBuilder: (_, int index) {
return ListTile(
title: Container(
child: Column(
children: [
Text(sections[index]['doOne']),
Text(sections[index]['doTwo']),
],
),
));
},
);
} else {
return Container();
}
}),
),
);
}
}