Flutter: How to subscribeToTopic for Firebase (FCM) registration token in Flutter - firebase

I want to subscribeToTopic for Firebase push notification in flutter , I can subscribe to any topic but my purpose to subscribeToTopic against token , here it is the code below,
FirebaseMessaging _messaging;
Firebase.initializeApp().then((fbr) {
_messaging = FirebaseMessaging.instance;
_messaging.getToken().then((token) async{
_messaging.subscribeToTopic(token).then((value) => null);
_messaging.subscribeToTopic(userID).then((value) => null);
_messaging.subscribeToTopic(userTypeId).then((value) => null);
}
}
But I am getting error
Failed assertion: line 307 pos 10: 'isValidTopic': is not true.
log attached below:
I/flutter ( 9352): Token: dhCABsvbQ8udQJha8VOxNy:APA91bEGcpS6-QMn-c236ITNbDtxEs3MD1Q-nquedMLzZv4XWPdGUWt-Zw-OQ6YBY383IJGZXxKXNMRJd8SKLeOO7agx4dcym6VoEhPTrbYr20NoscZHTZoPCf5mqbfiTHCS5q2WlXqw
I/flutter ( 9352): User granted permission
I/flutter ( 9352): Token: dhCABsvbQ8udQJha8VOxNy:APA91bEGcpS6-QMn-c236ITNbDtxEs3MD1Q-nquedMLzZv4XWPdGUWt-Zw-OQ6YBY383IJGZXxKXNMRJd8SKLeOO7agx4dcym6VoEhPTrbYr20NoscZHTZoPCf5mqbfiTHCS5q2WlXqw
E/flutter ( 9352): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: 'package:firebase_messaging/src/messaging.dart': Failed assertion: line 307 pos 10: 'isValidTopic': is not true.
E/flutter ( 9352): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:46:39)
E/flutter ( 9352): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
E/flutter ( 9352): #2 _assertTopicName (package:firebase_messaging/src/messaging.dart:307:10)
E/flutter ( 9352): #3 FirebaseMessaging.subscribeToTopic (package:firebase_messaging/src/messaging.dart:294:5)
E/flutter ( 9352): #4 _HomePageState.registerNotification.<anonymous closure> (package:notify/main.dart:89:20)
E/flutter ( 9352): #5 _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter ( 9352): #6 _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter ( 9352): #7 _FutureListener.handleValue (dart:async/future_impl.dart:152:18)
E/flutter ( 9352): #8 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)
E/flutter ( 9352): #9 Future._propagateToListeners (dart:async/future_impl.dart:733:32)
E/flutter ( 9352): #10 Future._completeWithValue (dart:async/future_impl.dart:539:5)
E/flutter ( 9352): #11 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:254:13)
E/flutter ( 9352): #12 MethodChannelFirebaseMessaging.getToken (package:firebase_messaging_platform_interface/src/method_channel/method_channel_messaging.dart)
E/flutter ( 9352): <asynchronous suspension>

The error is coming up because the token id you're passing as the topic name is not an acceptable topic name.
Here is the check that the token fails:
// https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_messaging/firebase_messaging/lib/src/messaging.dart
void _assertTopicName(String topic) {
bool isValidTopic = RegExp(r'^[a-zA-Z0-9-_.~%]{1,900}$').hasMatch(topic);
assert(isValidTopic);
}
Source
Use a valid string and the code should work fine.

Related

MissingPluginException exception when I try to connect my app to firebase authentication

When I try to initialize firebase with my flutter project I get this error:
[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: MissingPluginException(No implementation found for method Firebase#initializeCore on channel plugins.flutter.io/firebase_core)
At first I thought that it had something to do with the firebase core page but I've tried to use older page and I still get the same error
The complete error:
E/flutter ( 8415): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: MissingPluginException(No implementation found for method Firebase#initializeCore on channel plugins.flutter.io/firebase_core)
E/flutter ( 8415): #0 MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:157
E/flutter ( 8415): <asynchronous suspension>
E/flutter ( 8415): #1 MethodChannel.invokeMethod
package:flutter/…/services/platform_channel.dart:332
E/flutter ( 8415): #2 MethodChannel.invokeListMethod
package:flutter/…/services/platform_channel.dart:345
E/flutter ( 8415): #3 MethodChannelFirebase._initializeCore (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:30:36)
E/flutter ( 8415): #4 MethodChannelFirebase.initializeApp (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:75:13)
E/flutter ( 8415): #5 Firebase.initializeApp (package:firebase_core/src/firebase.dart:43:25)
E/flutter ( 8415): #6 main
package:crypto_wallet/main.dart:7
E/flutter ( 8415): #7 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:231:25)
E/flutter ( 8415): #8 _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 8415): #9 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 8415): #10 _runZoned (dart:async/zone.dart:1630:10)
E/flutter ( 8415): #11 runZonedGuarded (dart:async/zone.dart:1618:12)
E/flutter ( 8415): #12 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:223:5)
E/flutter ( 8415): #13 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
E/flutter ( 8415): #14 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter ( 8415):
The dependencies :
dependencies:
flutter:
sdk: flutter
firebase_core: "^0.5.0+1"
firebase_auth: "^0.18.1+2"
cloud_firestore: "^0.14.1+3"
This is my main function:
void main () async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
the build.gradle file (dependencies)
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath 'com.google.gms:google-services:4.3.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
I assume that you have the same issue as here. So you need to change the relevant part in your build.gradle file with the following:
'com.android.tools.build:gradle:3.5.0'
You can read more from here.

Flutter app fails to log in using google Sign In

Edit :- Interestingly my practice app with exact same code shows same console logs but work absolutely fine but the main app (this app) doesnt work.
My app was working fine till a few hours ago but since morning login fails with this error
E/flutter (24958): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)
Stackoverflow says to change com.android.tools.build:gradle. How did this suddenly happen I dint even touch the code.
Console:
W/ActivityThread( 1327): handleWindowVisibility: no activity for token android.os.BinderProxy#1796f22
V/ViewRootImpl( 1327): The specified message queue synchronization barrier token has not been posted or has already been removed
D/DecorView( 1327): onWindowFocusChangedFromViewRoot hasFocus: true, DecorView#d773c2a[SignInHubActivity]
D/DecorView( 1327): onWindowFocusChangedFromViewRoot hasFocus: true, DecorView#e79156a[MainActivity]
E/flutter ( 1327): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)
E/flutter ( 1327): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:572:7)
E/flutter ( 1327): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:161:18)
E/flutter ( 1327): <asynchronous suspension>
E/flutter ( 1327): #2 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
E/flutter ( 1327): #3 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:361:48)
E/flutter ( 1327): #4 MethodChannelGoogleSignIn.signIn (package:google_sign_in_platform_interface/src/method_channel_google_sign_in.dart:45:10)
E/flutter ( 1327): #5 GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:233:42)
E/flutter ( 1327): <asynchronous suspension>
E/flutter ( 1327): #6 GoogleSignIn._addMethodCall (package:google_sign_in/google_sign_in.dart:288:18)
E/flutter ( 1327): #7 GoogleSignIn.signIn (package:google_sign_in/google_sign_in.dart:359:9)
E/flutter ( 1327): #8 signInWithGoogle (package:opinion/services/google_sign_in.dart:8:71)
E/flutter ( 1327): #9 LoginButton.build.<anonymous closure> (package:opinion/components/login_button.dart:45:21)
E/flutter ( 1327): #10 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
E/flutter ( 1327): #11 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1098:38)
E/flutter ( 1327): #12 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
E/flutter ( 1327): #13 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
E/flutter ( 1327): #14 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
E/flutter ( 1327): #15 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:219:7)
E/flutter ( 1327): #16 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:477:9)
E/flutter ( 1327): #17 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:78:12)
E/flutter ( 1327): #18 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:124:9)
E/flutter ( 1327): #19 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
E/flutter ( 1327): #20 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:122:18)
E/flutter ( 1327): #21 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:108:7)
E/flutter ( 1327): #22 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:220:19)
E/flutter ( 1327): #23 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
E/flutter ( 1327): #24 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
E/flutter ( 1327): #25 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
E/flutter ( 1327): #26 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
E/flutter ( 1327): #27 _rootRunUnary (dart:async/zone.dart:1206:13)
E/flutter ( 1327): #28 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 1327): #29 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 1327): #30 _invoke1 (dart:ui/hooks.dart:267:10)
E/flutter ( 1327): #31 _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
E/flutter ( 1327):
I/flutter ( 1327): null
These 3 lines
V/ViewRootImpl( 1327): The specified message queue synchronization barrier token has not been posted or has already been removed
D/DecorView( 1327): onWindowFocusChangedFromViewRoot hasFocus: true, DecorView#d773c2a[SignInHubActivity]
D/DecorView( 1327): onWindowFocusChangedFromViewRoot hasFocus: true, DecorView#e79156a[MainActivity]
E/flutter ( 1327): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)
Indicate that there is an error with your SHA1 key. I think due to the new windows update the key got changed in your computer. Just generate a new one and replace it
The Platform Exception is because firebase is not being able to authenticate. Try catching the error and see the error code.
try {
[Firebase Login]
}
on PlatformException catch(error) {
print(error.code)
}

Permission denied when reading from database

I have a problem reading data from a firebase database.
The code below belongs to a function attached to a [FlatButton]:
void newEntry(){
print(_database.reference().child('todo').equalTo('Dan').once().then((value){
print(value.key);
}));
}
Whenever I run this piece of code I get this error:
I/flutter (29847): Instance of 'Future<dynamic>'
D/NetworkSecurityConfig(29847): No Network Security Config specified, using platform default
W/SyncTree(29847): Listen at /todo failed: DatabaseError: Permission denied
E/flutter (29847): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Instance of 'DatabaseError'
E/flutter (29847): #0 Query.once (package:firebase_database/src/query.dart:90:41)
E/flutter (29847): <asynchronous suspension>
E/flutter (29847): #1 _MyAppState.newEntry (package:database_project/main.dart:94:62)
E/flutter (29847): #2 _MyAppState._buildButton.<anonymous closure> (package:database_project/main.dart:88:9)
E/flutter (29847): #3 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:511:14)
E/flutter (29847): #4 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:566:30)
E/flutter (29847): #5 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:166:24)
E/flutter (29847): #6 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:240:9)
E/flutter (29847): #7 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:177:9)
E/flutter (29847): #8 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:436:9)
E/flutter (29847): #9 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
E/flutter (29847): #10 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
E/flutter (29847): #11 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:221:19)
E/flutter (29847): #12 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:199:22)chEvent (package:flutter/src/gestures/binding.dart:199:22) ePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (29847): #13 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)ePointerEvent (package:flutter/src/gestures/binding.dart:156:7) ePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (29847): #14 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (29847): #15 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (29847): #16 _rootRunUnary (dart:async/zone.dart:1136:13)
E/flutter (29847): #17 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (29847): #18 _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7) ity]
E/flutter (29847): #19 _invoke1 (dart:ui/hooks.dart:233:10)
E/flutter (29847): #20 _dispatchPointerDataPacket (dart:ui/hooks.dart:154:5) w{8084b2a VFE...... .F...... 0,0-1440,2872} of ViewRootImpl#b8c6359[MainActivity]
E/flutter (29847): t/com.example.database_project.MainActivity#8084b2a#0[29847])/#0xeeafd1b io.flutter.view.FlutterView{8084b2a VFE.D/ViewRootImpl#b8c6359[MainActivity](29847): MSG_WINDOW_FOCUS_CHANGED 0 1
D/InputMethodManager(29847): prepareNavigationBarInfo() DecorView#48d0f7a[MainActivew{8084b2a VFE...... .F...... 0,0-1440,2872}ity]
D/InputMethodManager(29847): getNavigationBarColor() -855310D/SurfaceView(29847): onWindowVisibilityChanged(8) false io.flutter.view.FlutterView{8084b2a VFE...... .F...... 0,0-1440,2872} of ViewRootImpl#b8c6359[MainActivity]D/SurfaceView(29847): show() Surface(name=SurfaceView - com.example.database_project/com.example.database_project.MainActivity#8084b2a#0[29847])/#0xeeafd1b io.flutter.view.FlutterView{8084b2a VFE...... .F...... 0,0-1440,2872}D/SurfaceView(29847): surfaceDestroyed callback.size 1 #2 io.flutter.view.FlutterView{8084b2a VFE...... .F...... 0,0-1440,2872}W/libEGL (29847): EGLNativeWindowType 0x7af3edd010 disconnect failed
D/SurfaceView(29847): destroy() Surface(name=SurfaceView - com.example.database_project/com.example.database_project.MainActivity#8084b2a#0[29847])/#0xeeafd1b io.flutter.view.FlutterView{8084b2a VFE...... .F...... 0,0-1440,2872}W/libEGL (29847): EGLNativeWindowType 0x7b02e2a010 disconnect failedD/OpenGLRenderer(29847): eglDestroySurface = 0x7af3f13680, 0x7b02e2a000D/ViewRootImpl#b8c6359[MainActivity](29847): Relayout returned: old=[0,0][1440,3040] new=[0,0][1440,3040] result=0x5 surface={valid=false 0} changed=trueD/ViewRootImpl#b8c6359[MainActivity](29847): setWindowStopped(true) old=false
D/SurfaceView(29847): windowStopped(true) false io.flutter.view.FlutterView{8084b2a VFE...... .F...... 0,0-1440,2872} of ViewRootImpl#b8c6359[MainActivity]
D/ViewRootImpl#b8c6359[MainActivity](29847): Surface release. android.view.WindowManagerGlobal.setStoppedState:669 android.app.Activity.performStop:7647 android.app.ActivityThread.callActivityOnStop:4372 android.app.ActivityThread.performStopActivityInner:4350 android.app.ActivityThread.handleStopActivity:4425 android.app.servertransaction.StopActivityItem.execute:41 android.app.servertransaction.TransactionExecutor.executeLifecycleState:145 android.app.servertransaction.TransactionExecutor.execute:70
D/InputTransport(29847): Input channel destroyed: fd=100
I/FirebaseAuth(29847): [FirebaseAuth:] Loading module via FirebaseOptions.I/FirebaseAuth(29847): [FirebaseAuth:] Preparing to create service connection to gms implementation
As for the path of the database is todo/userId/Dan Database.
EDIT: Forgot to mention that I updated my security rules as following:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
EDIT
As per #Andrey Ilyunin comment I've authenticated my application to an user and applied the same security rules. I still get the same exception, i.e:
D/NetworkSecurityConfig( 4123): No Network Security Config specified, using platform default
W/SyncTree( 4123): Listen at /todo failed: DatabaseError: Permission denied
E/flutter ( 4123): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Instance of 'DatabaseError'
E/flutter ( 4123): null
E/flutter ( 4123): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Instance of 'DatabaseError'
E/flutter ( 4123): null

Flutter built value Deserialization 'failed due to: Tried to build class but nested builder for field threw: Tried to construct class with null field

I am using built value for my PODO class
Following is my code
library mobile_login_model;
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
part 'mobile_login_model.g.dart';
abstract class MobileLoginModel implements Built<MobileLoginModel, MobileLoginModelBuilder> {
MobileLoginModel._();
factory MobileLoginModel([updates(MobileLoginModelBuilder b)]) = _$MobileLoginModel;
#BuiltValueField(wireName: 'status')
int get status;
#BuiltValueField(wireName: 'msg')
String get msg;
#BuiltValueField(wireName: 'data')
MobileLoginData get data;
static Serializer<MobileLoginModel> get serializer => _$mobileLoginModelSerializer;
}
abstract class MobileLoginData implements Built<MobileLoginData, MobileLoginDataBuilder> {
MobileLoginData._();
factory MobileLoginData([updates(MobileLoginDataBuilder b)]) = _$MobileLoginData;
#BuiltValueField(wireName: 'userid')
String get userId;
#BuiltValueField(wireName: 'mobile')
String get mobile;
static Serializer<MobileLoginData> get serializer => _$mobileLoginDataSerializer;
}
Following is my http code when i click on submit button
Future<MobileLoginModel> submitMobileNumber(String mobile) async {
final response = await http.post(LOGIN_MOBILE_NUMBER_URL,body: {
"mobile": mobile
});
MobileLoginModel mobileLoginModel = standardSerializers.deserializeWith(MobileLoginModel.serializer, json.decode(response.body));
return mobileLoginModel;
}
The http request is fired whenever i enter a mobile number and click on submit button. If i enter a correct number then everything works fine
but suppose i enter a wrong number i get following error in my console
E/flutter (19934): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter (19934): Deserializing '[status, 0, msg, Invalid Mobile Number.]' to 'MobileLoginModel' failed due to: Tried to build class "MobileLoginModel" but nested builder for field "data" threw: Tried to construct class "MobileLoginData" with null field "userId". This is forbidden; to allow it, mark "userId" with #nullable.
E/flutter (19934): #0 BuiltJsonSerializers._deserialize (package:built_value/src/built_json_serializers.dart:154:11)
E/flutter (19934): #1 BuiltJsonSerializers.deserialize (package:built_value/src/built_json_serializers.dart:105:18)
E/flutter (19934): #2 BuiltJsonSerializers.deserializeWith (package:built_value/src/built_json_serializers.dart:35:12)
E/flutter (19934): #3 MobileLoginApiProvider.submitMobileNumber (package:dice_clutter/resources/mobile_login/mobile_login_api_provider.dart:18:61)
E/flutter (19934): <asynchronous suspension>
E/flutter (19934): #4 MobileLoginRepository.submitMobileNumber (package:dice_clutter/resources/mobile_login/mobile_login_repository.dart:16:35)
E/flutter (19934): <asynchronous suspension>
E/flutter (19934): #5 MobileLoginBloc.submitMobileNumber (package:dice_clutter/bloc/mobile_login/mobile_login_bloc.dart:22:41)
E/flutter (19934): <asynchronous suspension>
E/flutter (19934): #6 _SubmitMobileNumberState.submitMobileNumber.<anonymous closure> (package:dice_clutter/screens/mobile_login/mobile_login.dart:177:25)
E/flutter (19934): #7 _RootZone.runUnary (dart:async/zone.dart:1379:54)
E/flutter (19934): #8 _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
E/flutter (19934): #9 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
E/flutter (19934): #10 Future._propagateToListeners (dart:async/future_impl.dart:671:32)
E/flutter (19934): #11 Future._complete (dart:async/future_impl.dart:476:7)
E/flutter (19934): #12 _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
E/flutter (19934): #13 _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
E/flutter (19934): #14 _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
E/flutter (19934): #15 checkInternetConnection (package:dice_clutter/helpers/internet_connection.dart)
E/flutter (19934): <asynchronous suspension>
E/flutter (19934): #16 _SubmitMobileNumberState.submitMobileNumber (package:dice_clutter/screens/mobile_login/mobile_login.dart:174:5)
E/flutter (19934): #17 _SubmitMobileNumberState.build.<anonymous closure>.<anonymous closure> (package:dice_clutter/screens/mobile_login/mobile_login.dart:151:31)
E/flutter (19934): #18 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
E/flutter (19934): #19 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
E/flutter (19934): #20 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter (19934): #21 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
E/flutter (19934): #22 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7)
E/flutter (19934): #23 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)
E/flutter (19934): #24 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
E/flutter (19934): #25 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
E/flutter (19934): #26 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:180:19)
E/flutter (19934): #27 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:158:22)
E/flutter (19934): #28 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:138:7)
E/flutter (19934): #29 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7)
E/flutter (19934): #30 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7)
E/flutter (19934): #31 _invoke1 (dart:ui/hooks.dart:168:13)
E/flutter (19934): #32 _dispatchPointerDataPacket (dart:ui/hooks.dart:122:5)
Because the data property is missing in the received JSON {"status": 0, "msg": "Invalid Mobile Number."} it needs to be nullable. By default all properties are non-nullable.
#nullable
#BuiltValueField(wireName: 'data')
MobileLoginData get data;
https://pub.dartlang.org/documentation/built_value/latest/built_value/nullable-constant.html

Firestore access broken after an offline attempt

I'm trying to access to a Cloud Firestore with this piece of code :
void _submit(BuildContext context) async {
final DocumentReference postRef = Firestore.instance.document(dbPath);
Firestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap = await transaction.get(postRef);
await transaction.update(freshSnap.reference, {
'value': freshSnap['value'] + 1
});
});
}
If wifi or mobile data are on, everything works fine. (as expected)
If wifi and mobile data are off, it does not work. (as expected). But when I wait until the timeout (after calling the method) and only then, turn mobile data and wifi on, it does not work anymore and I get the following errors :
E/flutter ( 7041): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 7041): PlatformException(Error performing transaction, Timed out waiting for Task, null)
E/flutter ( 7041): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:547:7)
E/flutter ( 7041): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:279:18)
E/flutter ( 7041): <asynchronous suspension>
E/flutter ( 7041): #2 Firestore.runTransaction (file:///C:/{myPath}/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.7.3/lib/src/firestore.dart:115:10)
E/flutter ( 7041): <asynchronous suspension>
E/flutter ( 7041): #3 _FeedbackPageState._submitFeedback (package:appli_salon_data/view/program/FeedbackPage.dart:74:26)
E/flutter ( 7041): <asynchronous suspension>
E/flutter ( 7041): #4 _FeedbackPageState.build.<anonymous closure> (package:appli_salon_data/view/program/FeedbackPage.dart:60:26)
E/flutter ( 7041): #5 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:494:14)
E/flutter ( 7041): #6 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:549:30)
E/flutter ( 7041): #7 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter ( 7041): #8 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
E/flutter ( 7041): #9 TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:123:7)
E/flutter ( 7041): #10 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
E/flutter ( 7041): #11 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:147:20)
E/flutter ( 7041): #12 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
E/flutter ( 7041): #13 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
E/flutter ( 7041): #14 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
E/flutter ( 7041): #15 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
E/flutter ( 7041): #16 _invoke1 (dart:ui/hooks.dart:134:13)
E/flutter ( 7041): #17 _dispatchPointerDataPacket (dart:ui/hooks.dart:91:5)
(not expected)
The method won't work again until I relaunch the app.
If anyone has some explanation about this behaviour, feel free to answer :)
UPDATE : I tried this :
Switch off Wifi
Try to run the transaction - results in expected failure
Switch on Wifi
Try to run the transaction
Here is the interesting part : at step 4, the transaction is "immediately" run twice, both times getting the error :
PlatformException(Error performing Transaction#get, UNAVAILABLE: Unable to resolve host firestore.googleapis.com, null)
when calling transaction.get(postRef).
Could it mean that Firestore somehow loses all access to the host after losing Internet connection briefly once ? How can I fix that ?
Have you tried enabling local persistence? Not sure if that'll catch the issue, but it might be worth a try. I believe this is done using the persistenceEnabled parameter in the settings method:
Firestore.instance.settings(persistenceEnabled: true)
Keep in mind that this should only be done once, so it should go somewhere in your code that won't get called every time you access any Firestore data.

Resources