How to get Future value without await?

Viewed 906

I am making an app which requires me an authentication and token check. I need to render Auth page if the user has no token & render Home if the token exists.

I am storing the token using flutter_secure_storage.

Flutter: 1.5.4

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'package:provider/provider.dart';

import 'package:myapp/api.dart';
import 'package:myapp/router.dart';

class App extends StatelessWidget {
  String _getInitialRoute(context) {
    final hasToken = Provider.of<API>(context).token != null; // Returns Future<String> instead of string
    return hasToken ? 'home' : 'auth';
  }

  // build async is throwing here an error.
  build(context) {
    return MaterialApp(
      /**
       * Disable debug banner.
       */
      debugShowCheckedModeBanner: false,

      /**
       * Initial route.
       */
      initialRoute: _getInitialRoute(context),

      /**
       * Routes.
       */
      onGenerateRoute: Router.generateRoute,

      /**
       * Application title.
       */
      title: 'My App',
    );
  }
}

I expect to get initialRoute based on token.

2 Answers

try this.

class MyApp extends StatelessWidget {
  MyApp();

  @override
  Widget build(BuildContext context) {
    return StoreProvider<AppState>(
      store: store,
      child: MaterialApp(
        title: 'Chaco Digital',
        debugShowCheckedModeBanner: false,
        onGenerateRoute: generateRoute,
        initialRoute: AUTH_HANDLER_ROUTE,
      ),
    );
  }
}

class AuthHandler extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new FutureBuilder(
              future: _storage.read(key: 'token'),
              builder: (_, AsyncSnapshot<bool> snapshot)
         => snapshot.hasData && snapshot.data ? HomePage() : SignInPage();
    );
  }
}

General answer:

yourFuture().then((value) {
  print(value);
});   

Answer specific to question's content:

void main() async {
  String initialRoute = await SomethingHere(); // get your awaited string
  runApp(
    MaterialApp(
      initialRoute: initialRoute,
      onGenerateRoute: ...,
    ),
  );
}
Related