首页 > 解决方案 > 使用 FutureBuilder 的登录流导航:Flutter?

问题描述


import 'package:flutter/material.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<AppThemeNotifier>(
      builder: (BuildContext context, AppThemeNotifier value, Widget child) {
        return Provider(
          create: "XXXXXXX",
          dispose: "XXXXXXX",
          child: MaterialApp(
              debugShowCheckedModeBanner: false,
              theme: AppTheme.getThemeFromThemeMode(value.themeMode()),
              home: Base()),
        );
      },
    );
  }
}

class Base extends StatefulWidget {
  @override
  _BaseState createState() => _BaseState();
}

class _BaseState extends State<Base> {

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<SessionAuth>(
      future: Provider.of<AppThemeNotifier>(context, listen: false).validate,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          SessionAuth session = new SessionAuth();
          if (session.userId != null && session.isLoggedIn) {
            return FullApp();
          } else if (isFirst) {
            return OnBoardingScreen();
          }
          return LoginScreen();
        } else {
          return Scaffold(
            body: Center(child: CircularProgressIndicator()),
          );
        }
      },
    );
  }
}

我试图根据通过提供程序包完成的会话验证来导航不同的屏幕。(登录流程管理)

简单地说,我想根据会话详细信息替换屏幕

分解

错误

会话验证

class SessionAuth {
  SessionAuth({this.isLoggedIn, this.userId, this.isFirst});
  int userId;
  bool isLoggedIn;
  bool isFirst;
}

证实

Future<SessionAuth> get validate async {
  SharedPreferences prefs = await SharedPreferences.getInstance();

  SessionAuth auth = new SessionAuth();
  auth.userId = prefs.getInt('userId') ?? null;
  auth.isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
  auth.isFirst = prefs.getBool("isFirst") ?? null;

  return auth;
}

标签: flutterauthenticationflutter-navigationflutter-futurebuilder

解决方案


推荐阅读