列表视图不显示来自流的数据

Posted

技术标签:

【中文标题】列表视图不显示来自流的数据【英文标题】:List view not displaying data from stream 【发布时间】:2020-07-13 23:20:56 【问题描述】:

我有以下服务,它连接到 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&lt;List&lt;Report&gt;&gt;(context);

但是,我的列表视图是在报表填充数据之前构建的,即使返回数据,列表视图也不会显示。

我单步执行代码,getReports 方法被命中,我检查了 Firestore,那里有超过 50 条记录。

我已经根据这个原始问题的建议调整了这个列表视图:List view throws an error before stream has finished retrieving data 但是删除了找出问题的条件。

谁能提出问题所在?

【问题讨论】:

【参考方案1】:

在获取报告数据之前,首先检查报告是否不等于空。

检查此代码

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();
        ,
      ),
    );
  ```

【讨论】:

以上是关于列表视图不显示来自流的数据的主要内容,如果未能解决你的问题,请参考以下文章

Android:来自列表视图项目的下一个/上一个数据详细信息[重复]

来自Sqlite的第二页JQM Listview不刷新

用于显示 JSON 列表视图的 Android 代码

如何将流生成器中的数据显示到文本字段中并更新来自列表视图?

UIPicker 视图不显示来自 JSON 数组的数据

Android:如何在列表视图中自动显示带有复选框的 Sqlite 数据库