kalittles
kalittles

Reputation: 345

Converting Firebase Token to String using Flutter

I have an application that is supposed to send the Firebase Token from my Flutter app to an ASP.Net App Server. The endpoint on the app server works - the request from the Flutter app to the App Server is not working.

The reason it is not working is because when I try to send the token, the token doesn't appear to have arrived yet - it's of type Future. How do I turn that token into a string when it finally arrives?

I've tried turning the token directly into a string in the fcmStream.Listen function, I've also tried turning it into a string using _firebaseMessaging.getToken. Neither of them work

  FirebaseMessaging _firebaseMessaging = new FirebaseMessaging();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    location.onLocationChanged().listen((value) {
      if (this.mounted) {
        setState(() {
          currentLocation = value;
        });
      }
    });
_firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) {
        print('on message $message');
      },
      onResume: (Map<String, dynamic> message) {
        print('on resume $message');
      },
      onLaunch: (Map<String, dynamic> message) {
        print('on launch $message');
      },
    );
    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(sound: true, badge: true, alert: true));
    String clientToken = _firebaseMessaging.getToken().then((token) {
      print("Token Init: " + token.toString());
    }
    ).toString();


    BackendService.postToken(clientToken.toString(), "[email protected]");

    @override
    Stream<String> fcmStream = _firebaseMessaging.onTokenRefresh;
    fcmStream.listen((token) {
      /*print("Token On Refresh: " + token);
      BackendService.postToken(token.toString(), "[email protected]");*/

    }
    );
    fcmStream.toString();

class BackendService {
  static Future<String> postToken(String token, String hostEmail) async {
    final responseBody = (await http.get(
            'realurlomitted/.../Meets/RegisterDevice?token=$token&hostEmail=$hostEmail')).body;
    print(" Response: " + responseBody.toString());

    return responseBody.toString();
  }
}

Whenever the token.toString prints, it prints the token just fine - I can see that. It just seems like whenever it tries to make the post using http, the token hasn't arrived from whatever getToken is.

If I can turn that Futrure into a string by awaiting it or something, it would solve my problem so that the $token parameter is the token as a string.

More specifically, my request URL should look like:

https://-----/Meets/RegisterDevice?token=c6V49umapn0:Jdsf90832094890s324&[email protected]

But it looks like:

https://-----/Meets/RegisterDevice?token=instance of Future<Dynamic>&[email protected]

In the Flutter debugger

Upvotes: 1

Views: 4588

Answers (2)

Rahman Rezaee
Rahman Rezaee

Reputation: 2165

This style is now available

FirebaseAuth.instance.currentUser().then((user) {
            if (user != null) {
              user.getIdToken().then((token) {
                Map<dynamic,dynamic> tokenMap = token.claims;
                print(tokenMap['sub']);
              });
            }
    });

so this complete code

 @override
  void initState() {


      FirebaseAuth.instance.currentUser().then((user) {
            if (user != null) {
              user.getIdToken().then((token) {
                Map<dynamic,dynamic> tokenMap = token.claims;
                print(tokenMap['sub']);
              });
            }
    });
    super.initState();
  }

Upvotes: 0

Abdou Ouahib
Abdou Ouahib

Reputation: 886

As you said, awaiting the future will solve your problem. You can write an async function and put the code in your initState inside it and use await, or you can do this:

_firebaseMessaging.getToken().then((token) {
      final tokenStr = token.toString();
      // do whatever you want with the token here
    }
);

Upvotes: 2

Related Questions