flutter - 如果登录,则颤振用户重定向
问题描述
仍然是颤振的初学者。下面是一个示例聊天应用程序,我尝试根据用户的登录状态重定向用户。到目前为止用模拟器测试,输出是我所期望的。我的问题是:
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(),
},
);
}
});
}
}
解决方案
是的,您的代码对我来说看起来不错。在runApp
.
我要给出的唯一额外提示是,通常,对于较大的应用程序,您将希望使用 BLoC 模式来管理状态。如果您将该模式添加到此代码示例中,它将从该组件中抽象出您正在执行的逻辑,并且您可以管理集团的未来。然后,您可以为加载屏幕使用无状态小部件。Flutter Bloc 库提供了有用、直接的抽象,展示了如何实现 bloc 模式。
推荐阅读
- java - 编译 Jigsaw 多模块
- arrayfire - ArrayFire approx1 / approx2 示例
- java - Android:.setOnClickListener 上的 java.lang.NullPointerException
- amazon-web-services - 使用 TCP TLS 到 Nginx 的 AWS 经典负载均衡器
- angular - 将标签连接到复选框组件
- docker - 在马拉松上的 docker 中设置故障转移 activemq 代理
- teamcity - TeamCity 复合构建配置不会失败
- javascript - 从 Vue 的 build/webpack 阶段排除工作代码
- java - 转换地图
到地图 - php - 表单验证问题服务器端代码未验证