使用Flutter应用程序和Cloud Firestore插件。似乎您可以随时根据需要调用Firestore.instance,但是从插件文档中查看示例应用程序时,他们将其设置为与自述文件不同。他们在主文件中对其进行初始化,然后像这样引用主文件:
final FirebaseApp app = await FirebaseApp.configure(
name: 'test',
options: const FirebaseOptions(
googleAppID: '1:79601577497:ios:5f2bcc6ba8cecddd',
gcmSenderID: '79601577497',
apiKey: 'AIzaSyArgmRGfB5kiQT6CunAOmKRVKEsxKmy6YI-G72PVU',
projectID: 'flutter-firestore',
),
);
final Firestore firestore = Firestore(app: app);
runApp(MaterialApp(
title: 'Firestore Example', home: MyHomePage(firestore: firestore)));
}
这是必需的吗?我在使用流时遇到一个奇怪的错误,如果我创建一个流并发送更新流的任何类型的数据,然后退出应用程序并重新启动它。当我尝试将数据再次推送到该流时,该应用程序崩溃。我正在使用聊天功能,因此我的聊天页面可以像这样流式传输所有消息:
@override
Widget build(BuildContext context) {
DMProfile dmProfile = Provider.of<DMProfile>(context);
PlayerProfile playerProfile = Provider.of<PlayerProfile>(context);
return StreamBuilder<List<Message>>(
stream: Firestore.instance
.collection('chats')
.document(widget.chatId)
.collection('messages')
.orderBy('timestamp', descending: true)
.limit(20)
.snapshots()
.map((list) =>
list.documents.map((doc) => Message.fromFirestore(doc)).toList()),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return LoadingPage();
}
List<Message> messageStream = snapshot.data;
if (messages.length == 0) {
messages = messageStream;
hasMore = !(messageStream.length < 20);
} else if (messages.first.timestamp != null &&
messageStream.first.timestamp != null) {
if (messageStream.first.timestamp
.compareTo(messages.first.timestamp) !=
0) {
print('Not equal');
messages.insert(0, messageStream.first);
}
}
return Expanded(
child: ListView.builder(
reverse: true,
padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
controller: listScrollController,
itemCount: messages.length,
itemBuilder: (context, index) {
final messageText = messages[index].message;
final messageSender = messages[index].senderId;
final currentUser =
widget.isPlayer ? playerProfile.userId : dmProfile.userId;
return MessageBubble(
imageUrl: messageSender == playerProfile.userId
? playerProfile.imageUrl
: dmProfile.imageUrl,
text: messageText,
isMe: currentUser == messageSender,
);
},
),
);
},
);
}
我发送这样的消息:
sendMessage({
String sender,
String receiver,
String message,
bool isPlayer,
String dmName,
String playerName,
String dmImage,
String playerImage,
}) async {
String sender1 = sender.compareTo(receiver) < 0 ? sender : receiver;
String sender2 = sender.compareTo(receiver) > 0 ? sender : receiver;
String chatName = '${sender1}_$sender2';
await Firestore.instance
.collection(CHAT_COLLECTION)
.document(chatName)
.setData({
'dm': isPlayer ? receiver : sender,
'dm_image': dmImage,
'dm_name': dmName,
'player': isPlayer ? sender : receiver,
'player_image': playerImage,
'player_name': playerName,
'dm_hidden': false,
'player_hidden': false,
'timestamp': FieldValue.serverTimestamp(),
'dm_seen': isPlayer ? false : true,
'player_seen': isPlayer ? true : false,
'last_message': {
'message': message,
'sender_name': isPlayer ? playerName : dmName,
'sender_id': sender,
'receiver_id': receiver,
},
}, merge: true);
await Firestore.instance
.collection(CHAT_COLLECTION)
.document(chatName)
.collection(MESSAGES_COLLECTION)
.add({
'sender_id': sender,
'receiver_id': receiver,
'sender_name': isPlayer ? playerName : dmName,
'message': message,
'timestamp': FieldValue.serverTimestamp(),
});
}
但是,如果我执行以下步骤:
发送消息 我收到以下错误,应用程序崩溃:
E / AndroidRuntime(21665):致命异常:主要 E / AndroidRuntime(21665):进程:com.crimsonowl.scryer,PID:21665 E / AndroidRuntime(21665):java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void io.flutter.plugin.common.MethodChannel.invokeMethod(java.lang.String,java.lang.Object)' E / AndroidRuntime(21665):位于io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ EventObserver.onEvent(CloudFirestorePlugin.java:451) E / AndroidRuntime(21665):位于io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ EventObserver.onEvent(CloudFirestorePlugin.java:433) E / AndroidRuntime(21665):位于com.google.firebase.firestore.Query.lambda $ addSnapshotListenerInternal $ 2(com.google.firebase:firebase-firestore @@ 21.3.0:1025) E / AndroidRuntime(21665):位于com.google.firebase.firestore.Query $$ Lambda $ 3.onEvent(未知来源:6) E / AndroidRuntime(21665):位于com.google.firebase.firestore.core.AsyncEventListener.lambda $ onEvent $ 0(com.google.firebase:firebase-firestore @@ 21.3.0:42) E / AndroidRuntime(21665):位于com.google.firebase.firestore.core.AsyncEventListener $$ Lambda $ 1.run(未知来源:6) E / AndroidRuntime(21665):位于android.os.Handler.handleCallback(Handler.java:883) E / AndroidRuntime(21665):位于android.os.Handler.dispatchMessage(Handler.java:100) E / AndroidRuntime(21665):位于com.google.android.gms.internal.tasks.zzb.dispatchMessage(com.google.android.gms:play-services-tasks @@ 17.0.2:6) E / AndroidRuntime(21665):位于android.os.Looper.loop(Looper.java:214) E / AndroidRuntime(21665):位于android.app.ActivityThread.main(ActivityThread.java:7356) E / AndroidRuntime(21665):位于java.lang.reflect.Method.invoke(本机方法) E / AndroidRuntime(21665):在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:492) E / AndroidRuntime(21665):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) I /进程(21665):正在发送信号。 PID:21665 SIG:9
我已经尝试了一切,并仔细研究了尽可能多的文档,似乎无法找到解决方案。
答案 0 :(得分:1)
在github页面上查找cloud_firestore并阅读了一些其他已发布的问题之后,这是新版本的cloud_firestore的错误。现在降级为0.13.4+2
,它可以解决此问题。需要注意将来的版本和错误修复,以查看何时解决该问题。 Flutter官方软件包一直得到了大力支持和频繁更新
答案 1 :(得分:1)
要实际回答标题,可以,您可以多次使用 Firestore.instance
。它实际上不是函数,因此您实际上并不会“ 调用”。您将从类中获取静态变量。