Flutter 使用CloudFirestore的Flotter StreamProvider导致恢复时出错
有一个奇怪的问题,似乎无法找出我是否有什么设置错误(新的提供商和流)或如果它是一个错误。除了在Android上用“后退”按钮退出并重新启动应用程序后,应用程序恢复运行外,一切似乎都正常。复制步骤:Flutter 使用CloudFirestore的Flotter StreamProvider导致恢复时出错,flutter,Flutter,有一个奇怪的问题,似乎无法找出我是否有什么设置错误(新的提供商和流)或如果它是一个错误。除了在Android上用“后退”按钮退出并重新启动应用程序后,应用程序恢复运行外,一切似乎都正常。复制步骤: 发布应用程序 点击后退按钮关闭应用程序(不仅仅是最小化) 重新启动应用程序 我得到以下错误: D/AndroidRuntime( 3566): Shutting down VM E/AndroidRuntime( 3566): FATAL EXCEPTION: main E/AndroidRuntim
D/AndroidRuntime( 3566): Shutting down VM
E/AndroidRuntime( 3566): FATAL EXCEPTION: main
E/AndroidRuntime( 3566): Process: com.crimsonowl.scryer, PID: 3566
E/AndroidRuntime( 3566): java.lang.NullPointerException: Attempt to invoke virtual method 'void io.flutter.plugin.common.MethodChannel.invokeMethod(java.lang.String, java.lang.Object)' on a null object reference
E/AndroidRuntime( 3566): at io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$DocumentObserver.onEvent(CloudFirestorePlugin.java:429)
E/AndroidRuntime( 3566): at io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$DocumentObserver.onEvent(CloudFirestorePlugin.java:402)
E/AndroidRuntime( 3566): at com.google.firebase.firestore.DocumentReference.lambda$addSnapshotListenerInternal$2(com.google.firebase:firebase-firestore@@21.3.0:504)
E/AndroidRuntime( 3566): at com.google.firebase.firestore.DocumentReference$$Lambda$3.onEvent(Unknown Source:6)
E/AndroidRuntime( 3566): at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(com.google.firebase:firebase-firestore@@21.3.0:42)
E/AndroidRuntime( 3566): at com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(Unknown Source:6)
E/AndroidRuntime( 3566): at android.os.Handler.handleCallback(Handler.java:883)
E/AndroidRuntime( 3566): at android.os.Handler.dispatchMessage(Handler.java:100)
E/AndroidRuntime( 3566): at com.google.android.gms.internal.tasks.zzb.dispatchMessage(com.google.android.gms:play-services-tasks@@17.0.2:6)
E/AndroidRuntime( 3566): at android.os.Looper.loop(Looper.java:214)
E/AndroidRuntime( 3566): at android.app.ActivityThread.main(ActivityThread.java:7356)
E/AndroidRuntime( 3566): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 3566): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
E/AndroidRuntime( 3566): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process ( 3566): Sending signal. PID: 3566 SIG: 9
经过大量调试并试图找出原因。我把问题缩小到StreamProvider和我的用户数据。在我的主屏幕中,我加载了一个用户数据流,其中包括:
return FutureProvider.value(
value: Provider.of<IAPProvider>(context).initialize(),
child: StreamProvider<User>.value(
value: DatabaseProvider().streamUser(user.uid),
child: MainScreen(),
),
);
我用同样的复制步骤得到同样的崩溃。本期中也提到了这一点,但没有得到解决。我临时解决了这个问题,强制将pubspec.yaml文件中的firestore包降级到这个“cloud_firestore:'0.13.4+2'
Stream<User> streamUser(String id) {
return Firestore.instance
.collection(USER_COLLECTION)
.document(id)
.snapshots()
.map((snap) => User.fromFirestore(snap));
}
Firestore.instance.collection(USER_COLLECTION).document(user.uid).updateData({'last_login': FieldValue.serverTimestamp()});