颤抖的用户重定向,如果登录

时间:2020-01-22 16:27:22

标签: flutter dart

还是个初学者。以下是我尝试根据用户登录状态重定向用户的示例聊天应用程序。 到目前为止,使用模拟器进行了测试,输出是我所期望的。我的问题是:

1。这是用户重定向的正确方法,还是在更好的重构代码中有更好的方法?

2。可以对“ return materialApp”进行任何重构,因为它非常重复。 (仅更改initialRoute)

3。对RunApp一个StatefulWidget有何影响?因为所有教程通常都将runApp启动为StatelessWidget

import 'package:flutter/material.dart';
import 'package:chatting/screens/login_screen.dart';
import 'package:chatting/screens/registration_screen.dart';
import 'package:chatting/screens/chat_screen.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'dart:async';

void main() => runApp(LoadPage());

class LoadPage extends StatefulWidget {
  @override
  _LoadPageState createState() => _LoadPageState();
}

class _LoadPageState extends State<LoadPage> {
  Future checkIfLoggedIn;

  @override
  void initState() {
    super.initState();
    checkIfLoggedIn = FirebaseAuth.instance.currentUser();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<FirebaseUser>(
        future: checkIfLoggedIn,
        builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.none:
            case ConnectionState.waiting:
              return Center(
                child: CircularProgressIndicator(
                  backgroundColor: Colors.lightBlueAccent,
                ),
              );
            default:
              if (snapshot.hasData)
                return MaterialApp(
                  debugShowCheckedModeBanner: false,
                  initialRoute: ChatScreen.id,
                  routes: {
                    ChatScreen.id: (context) => ChatScreen(),
                    LoginScreen.id: (context) => LoginScreen(),
                    RegistrationScreen.id: (context) => RegistrationScreen(),
                  },
                );
              else
                return MaterialApp(
                  debugShowCheckedModeBanner: false,
                  initialRoute: LoginScreen.id,
                  routes: {
                    ChatScreen.id: (context) => ChatScreen(),
                    LoginScreen.id: (context) => LoginScreen(),
                    RegistrationScreen.id: (context) => RegistrationScreen(),
                  },
                );
          }
        });
  }
}

1 个答案:

答案 0 :(得分:0)

是的,您的代码对我来说看起来不错。在runApp中使用StatefulWidget没问题。

我唯一要提供的提示是,通常对于大型应用程序,您将需要使用BLoC模式来管理状态。如果将这种模式添加到此代码示例中,它将从该组件中抽象出您正在执行的逻辑,并且您可以在集团中管理未来。然后,您可以在加载屏幕上使用无状态窗口小部件。 Flutter Bloc library提供了有用的,直接的抽象,它们展示了如何实现集团模式。