Streambuilder 仅在首次启动应用程序时显示来自本地缓存的数据
Streambuilder only showing data from local cache on first launch of app
我正在使用 StreamBuilder 从 firestore 流式传输数据。
StreamBuilder<QuerySnapshot>(
stream: _firestore.collection('meals').where('email', isEqualTo: loggedInUser.email).orderBy('date', descending: true).snapshots(),
如果我取出流的 .where
部分,它将 returns 所有数据发送到设备。完成此操作后,我可以将 .where
部分放回去,它工作正常。但是,它不会立即起作用。这表明 .where
部分仅在缓存已有数据后才有效。此外,如果我使用 firestore 控制台添加文档,它不会使用新数据更新应用程序。但出于某种原因,如果我删除 .where
部分,它将显示所有更新的文档。
我真的很困惑。有什么想法吗?
谢谢杰森
更新:我现在想出了解决这个问题的方法。请在下面查看我的回答,了解我是如何解决它的。
我终于找到了问题的答案。
我将 queryUserData();
添加到 initState()
。这是它在代码中的样子:
class HomeScreen extends StatefulWidget {
static const String id = 'home_screen';
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final _firestore = Firestore.instance;
final _auth = FirebaseAuth.instance;
FirebaseUser loggedInUser;
@override
void initState() {
super.initState();
getCurrentUser();
queryUserData();
}
void getCurrentUser() async {
try {
final user = await _auth.currentUser();
if (user != null) {
loggedInUser = user;
print('this is a test${loggedInUser.email}');
}
} catch (e) {
print(e);
}
}
void queryUserData() async {
final user = await _auth.currentUser();
loggedInUser = user;
final query = await _firestore.collection('meals').orderBy('date', descending: true).where('email', isEqualTo: '${loggedInUser.email}').getDocuments(source: Source.cache);
var totalEquals = query.documents.length;
print('$totalEquals records found for this user');
if (totalEquals >= 1) {
print(query);
print('cache has data. Therefore data will now only be read from cache');
} else {
print('data will be read from firestore until you have at least 1 meal');
getFirestoreInitialData();
}
}
void getFirestoreInitialData() async {
final query = await _firestore.collection('meals').getDocuments();
print(query);
print('data still being read from firestore');
}
我正在使用 StreamBuilder 从 firestore 流式传输数据。
StreamBuilder<QuerySnapshot>(
stream: _firestore.collection('meals').where('email', isEqualTo: loggedInUser.email).orderBy('date', descending: true).snapshots(),
如果我取出流的 .where
部分,它将 returns 所有数据发送到设备。完成此操作后,我可以将 .where
部分放回去,它工作正常。但是,它不会立即起作用。这表明 .where
部分仅在缓存已有数据后才有效。此外,如果我使用 firestore 控制台添加文档,它不会使用新数据更新应用程序。但出于某种原因,如果我删除 .where
部分,它将显示所有更新的文档。
我真的很困惑。有什么想法吗?
谢谢杰森
更新:我现在想出了解决这个问题的方法。请在下面查看我的回答,了解我是如何解决它的。
我终于找到了问题的答案。
我将 queryUserData();
添加到 initState()
。这是它在代码中的样子:
class HomeScreen extends StatefulWidget {
static const String id = 'home_screen';
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final _firestore = Firestore.instance;
final _auth = FirebaseAuth.instance;
FirebaseUser loggedInUser;
@override
void initState() {
super.initState();
getCurrentUser();
queryUserData();
}
void getCurrentUser() async {
try {
final user = await _auth.currentUser();
if (user != null) {
loggedInUser = user;
print('this is a test${loggedInUser.email}');
}
} catch (e) {
print(e);
}
}
void queryUserData() async {
final user = await _auth.currentUser();
loggedInUser = user;
final query = await _firestore.collection('meals').orderBy('date', descending: true).where('email', isEqualTo: '${loggedInUser.email}').getDocuments(source: Source.cache);
var totalEquals = query.documents.length;
print('$totalEquals records found for this user');
if (totalEquals >= 1) {
print(query);
print('cache has data. Therefore data will now only be read from cache');
} else {
print('data will be read from firestore until you have at least 1 meal');
getFirestoreInitialData();
}
}
void getFirestoreInitialData() async {
final query = await _firestore.collection('meals').getDocuments();
print(query);
print('data still being read from firestore');
}