Для приложения, которое я создаю во Flutter, я пытаюсь получить список зарезервированных временных интервалов зарегистрированным пользователем в разные дни из Firestore. Я попадаю в точку, где я могу получить зарезервированные временные интервалы в определенный день (путем жесткого кодирования дня и передачи его в futurebuilder), но когда я пытаюсь извлечь данные из коллекции collectionGroup, список остается пустым. Теперь, как новичок Flutter, я нахожу понимание того, как обрабатывать запросы collectionGroup, довольно сложно, и поэтому любая помощь будет принята с благодарностью!
Для быстрого обзора структуры моей базы данных я включил в github 2 изображения:
Изображение 1: https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-10%20om%2020.08.20.png?raw=true
Изображение 2: https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-10%20om%2020.08.43.png?raw=true
Ниже я включил моего будущего построителя и построителя списков
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class TimesTest extends StatefulWidget {
@override
_TimesTestState createState() => _TimesTestState();
}
class _TimesTestState extends State<TimesTest> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: MyFutureBuilder('2019-11-10'),
),
);
}
}
class MyFutureBuilder extends StatelessWidget {
final String date;
MyFutureBuilder(this.date);
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: MyTimes().getMyTimes('${loggedInUser.email}', date),
builder: (context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(
backgroundColor: Colors.lightBlueAccent,
),
);
} else if (snapshot.hasData) {
return ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, int index) {
DocumentSnapshot user = snapshot.data.documents[index];
return Padding(
padding: EdgeInsets.symmetric(
horizontal: 7.0,
vertical: 3.0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Card(
color: Colors.white,
child: Container(
child: ListTile(
onTap: () {},
title: Text(
user.data['hour'],
style: TextStyle(
color: Colors.grey[900],
),
),
subtitle: Text(
user.data['reserved'],
style: TextStyle(
color: Colors.grey[900],
),
),
leading: Icon(
Icons.access_time,
color: Colors.grey[900],
),
),
),
),
],
),
);
});
} else if (snapshot.connectionState == ConnectionState.done &&
!snapshot.hasData) {
return Center(
child: Text('No times found'),
);
} else {
return Center(
child: Text('No times found'),
);
}
},
);
}
}
И вот как я получаю данные из пожарного магазина.
import 'package:cloud_firestore/cloud_firestore.dart';
class MyTimes {
Future getMyTimes(String reserved, String date) async {
return Firestore.instance
.collection('days')
.document(date)
.collection('hours')
.where('reserved', isEqualTo: reserved)
.getDocuments();
}
}
//I have also tried this:
//class MyTimes {
// Future getMyTimes(String reserved) async {
// return Firestore()
// .collectionGroup('hours')
// .where('reserved', isEqualTo: reserved)
// .getDocuments();
// }
//}
Я создал индекс с идентификатором коллекции «часы» и с диапазоном сбора «collectionGroup», мои правила безопасности сейчас следующие:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
match /{path=**}/hours/{document}{
allow read, write;
}
}
}
Я потратилчасы и часы, пытаясь выяснить это, так что на самом деле что-нибудь полезное будет высоко ценится!