首页 > 解决方案 > 如果登录,则颤振用户重定向

问题描述

仍然是颤振的初学者。下面是一个示例聊天应用程序,我尝试根据用户的登录状态重定向用户。到目前为止用模拟器测试,输出是我所期望的。我的问题是:

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

2.return materialApp 可以进行任何重构,因为它非常重复。(仅更改初始路由)

3.运行一个StatefulWidget有什么影响吗?因为所有教程通常都会启动 runApp a 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(),
                  },
                );
          }
        });
  }
}

标签: flutterdart

解决方案


是的,您的代码对我来说看起来不错。在runApp.

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


推荐阅读