firebase - Flutter/Firestore/Provider - 瞬间显示错误然后显示流,如何在启动时加载流值?
问题描述
我正在使用 Stream Provider 访问 Firestore 数据并将其传递给我的应用程序。当我第一次运行应用程序时,我面临的问题就开始了。一切都正常开始,但是当我导航到在列表视图中使用 Stream 值的屏幕时,我最初在 UI 重建之前收到错误,并且列表项会在一瞬间出现。这是我得到的错误:
════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building OurInboxPage(dirty, dependencies: [_InheritedProviderScope<List<InboxItem>>]):
The getter 'length' was called on null.
Receiver: null
Tried calling: length
我猜这与访问值并将它们添加到屏幕的加载时间有关吗?如何在应用程序启动时加载所有流值以避免这种情况?
这是我的流代码:
Stream<List<InboxItem>> get inboxitems {
return orderCollection
.where("sendTo", isEqualTo: FirebaseAuth.instance.currentUser.email)
.snapshots()
.map(
(QuerySnapshot querySnapshot) => querySnapshot.docs
.map(
(document) => InboxItem.fromFirestore(document),
)
.toList(),
);
}
然后我将其添加到我的提供者列表中:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MultiProvider(
providers: [
StreamProvider<List<InboxItem>>.value(value: OurDatabase().inboxitems),
],
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<OurUser>(
builder: (_, user, __) {
return MaterialApp(
title: 'My App',
theme: OurTheme().buildTheme(),
home: HomepageNavigator(),
);
},
);
}
}
最后是我要显示流项目的页面:
class OurInboxPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
List<InboxItem> inboxList = Provider.of<List<InboxItem>>(context);
return Scaffold(
body: Center(
child: ListView.builder(
itemCount: inboxList.length,
itemBuilder: (context, index) {
final InboxItem document = inboxList[index];
return Card(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(document.event),
Icon(Icons.arrow_forward_ios)
],
),
);
},
),
),
);
}
}
谢谢
解决方案
是的,它试图在填充数据之前构建,因此出现空错误。
如果没有数据,请将您的包装ListView.builder
在 a中并让它显示加载指示器。StreamBuilder
StreamBuilder<List<InboxItem>>(
stream: // your stream here
builder: (context, snapshot) {
if (snapshot.hasData) {
return // your ListView here
} else {
return CircularProgressIndicator();
}
},
);
推荐阅读
- postgresql - java.lang.OutOfMemoryError:使用 AMAZON RDS Postgresql 进行批量插入期间的 Java 堆空间
- python - 字典中的 Pandas 数据框将值作为元组返回
- pyinstaller - 发生 Pyinstaller 模块未找到错误。如何解决?
- xml - 为什么我无法打印到 Odoo 中的任何报告?
- android - 无法使用 Android Studio 签署 APK - 出现异常:DerInputStream.getlength()
- machine-learning - Conv-neural-network 的损失没有减少,而是过时了
- sql - 如何找出哪些查询(或计划)使用 Azure SQL 或 SQL Server 上的特定索引?
- c - 如果已知所有消息都具有某个固定长度并且已知某些字节,是否可以优化 MD5 实现?
- c# - 无法使用 IIS express 在浏览器中打开 asp.net mvc 网站
- nginx - Nginx 指定用于搜索文件名的正则表达式