Flutter Firebase Auto Login - PullRequest
       5

Flutter Firebase Auto Login

0 голосов
/ 29 марта 2020

Итак, я пытаюсь настроить автоматический вход в систему с помощью Firebase и провайдера, все работает, но проблема в том, что для того, чтобы узнать, вошел ли он в систему, требуется секунда. Я бы предпочел, чтобы вместо страницы приветствия отображался загрузчик домашняя страница пользователя.

В основном при запуске приложения первое, что нужно показать, это WelcoePage (), а через секунду появится соответствующая страница. Как мне ускорить его или как показать загрузчик или что-то, кроме WelcomePage (), когда пользователь вошел в систему.

Код:

user_provider.dart

class UserProvider with ChangeNotifier {
  var _auth;
  User _user;

  UserProvider.instance() : _auth = Services().auth.auth {
    _auth.onAuthStateChanged.listen((u) async {
      if (u != null) {

        // When creates a new user and before it creates the user document
        // the app crashes because the user doesn't actually exist at that
        // point so I just have a checker if the user actually exists in
        // Firestore for the next function to work which retrieves the user document.

        if (await APIs().users.userExists(userID: u.uid)) { 
          this.user = await APIs().users.user(userID: u.uid);
        }
      } else {
        this.user = null;
      }
    });
  }
  // ...
}

main.dart

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  List<CameraDescription> cameras = await availableCameras();

  Widget _consumer() => Consumer4<ThemeProvider, CameraProvider, NetworkProvider, UserProvider>(
        builder: (context, theme, camera, network, user, child) => App(
          page: user.user == null
              ? WelcomePage()
              : user.user.isEmployer ? EmployerPage() : user.user.resume == null ? SProfileSetupPage() : SeekerPage(),
              // Detection to where the page should be.
        ),
      );

  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider<ThemeProvider>(
          create: (_) => ThemeProvider(Themes.light),
        ),
        ChangeNotifierProvider<CameraProvider>(
          create: (_) => CameraProvider(cameras),
        ),
        ChangeNotifierProvider<NetworkProvider>(
          create: (_) => NetworkProvider.instance(),
        ),
        ChangeNotifierProvider<UserProvider>(
          create: (_) => UserProvider.instance(),
        ),
      ],
      child: await Funcs.isPhysicalDevice()
          ? _consumer()
          : Constants.isDebug
              ? DevicePreview(
                  builder: (context) => _consumer(),
                )
              : _consumer(),
    ),
  );
}

class App extends StatelessWidget {
  final Widget page;

  const App({Key key, this.page}) : super(key: key);

  @override
  Widget build(BuildContext context) => Platform.isIOS
      ? CupertinoApp(
          home: this.page,
          theme: Utils.currentTheme(context: context).cupertinoOverrideTheme,
          navigatorObservers: [
            Services().analytics.firebaseAnalyticsObserver,
          ],
          title: Constants.title,
          localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
            DefaultMaterialLocalizations.delegate,
            DefaultWidgetsLocalizations.delegate,
          ],
          debugShowCheckedModeBanner: false,
        )
      : MaterialApp(
          home: this.page,
          theme: Utils.currentTheme(context: context),
          navigatorObservers: [
            Services().analytics.firebaseAnalyticsObserver,
          ],
          title: Constants.title,
          localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
            DefaultMaterialLocalizations.delegate,
            DefaultWidgetsLocalizations.delegate,
          ],
          debugShowCheckedModeBanner: false,
        );
}
...