У меня есть следующий сервис, который подключается к Firestore и возвращает все документы.
class FirestoreService {
Firestore _db = Firestore.instance;
var random = Random();
Stream<List<Report>> getReports() {
var data = _db
.collection('reports')
.orderBy('timeStamp', descending: true)
.snapshots()
.map((snapshot) => snapshot.documents
.map((document) => Report.fromJson(document.data))
.toList());
return data;
}
Я использую StreamProvider и создаю ссылку на вышеуказанный поток в моем main.dart
:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final FirestoreService _db = FirestoreService();
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (BuildContext context) => SettingsProvider()),
StreamProvider(create: (BuildContext context) => _db.getReports(),)
],
child: MaterialApp(
title: 'Wax App',
theme: ThemeData(
primarySwatch: Colors.deepPurple,
accentColor: Colors.deepOrangeAccent),
home: Home(),
),
);
}}
Мой Home()
виджет выглядит следующим образом:
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
FirestoreService _db = FirestoreService();
SettingsProvider settings = Provider.of<SettingsProvider>(context);
var reports = Provider.of<List<Report>>(context);
return Scaffold(
appBar: AppBar(
title: Text('Wax App'),
centerTitle: true,
actions: <Widget>[
IconButton(
icon: Icon(Icons.settings),
onPressed: () {
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => Settings()));
})
],
),
body: ListView.builder(
itemCount: reports.length,
itemBuilder: (context, index) {
Report report = reports[index];
return ListTile(
leading: (settings.units == 'Metric')
? Text(report.temp.toString()+ '\u00B0')
: Text((((report.temp) * (9/5)) + 32).round().toString() + '\u00B0'),
title: Text(report.wax),
subtitle: Text(report.line),
trailing: Text(formatDate(
DateTime.parse(report.timeStamp), [h, ':', nn, ' ', am])),
);
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
_db.addReport();
},
),
);
}}
Как видите, я получаю отчеты по этой строке:
var reports = Provider.of<List<Report>>(context);
тем не менее, мое представление списка создается до того, как отчеты будут заполнены данными, и даже когда данные возвращаются, представление списка не отображается.
Я прошел по коду и нажал метод getReports
Я проверил Firestore и там более 50 записей.
Я подготовил этот список в соответствии с предложениями из этого первоначального вопроса: Просмотр списка выдает ошибку до того, как поток завершит получение данных однако удалили условия для выяснения проблемы.
Кто-нибудь может подсказать, в чем проблема?