Представление списка не отображает данные из потока - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующий сервис, который подключается к 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 записей.

Я подготовил этот список в соответствии с предложениями из этого первоначального вопроса: Просмотр списка выдает ошибку до того, как поток завершит получение данных однако удалили условия для выяснения проблемы.

Кто-нибудь может подсказать, в чем проблема?

1 Ответ

0 голосов
/ 02 апреля 2020

перед извлечением данных отчетов, сначала проверьте, что отчеты не равны нулю.

Проверьте этот код

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: reports != null ? 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])),
            );
          }):
          CircularProgressIndicator(),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          _db.addReport();
        },
      ),
    );
  }}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...