【发布时间】:2020-11-28 12:51:24
【问题描述】:
我已经为自定义按钮创建了一个文件作为小部件功能。但我需要在很多地方使用它。但是我需要将页面路由到当时我需要的地方。如何做到这一点?请帮忙!
【问题讨论】:
标签: android flutter authentication google-signin
我已经为自定义按钮创建了一个文件作为小部件功能。但我需要在很多地方使用它。但是我需要将页面路由到当时我需要的地方。如何做到这一点?请帮忙!
【问题讨论】:
标签: android flutter authentication google-signin
创建一个名为 ROOTPAGE.dart 的文件并添加代码以检查是否存在现有用户登录。如果找到用户 ID,则转到主页,否则转到登录,
import 'package:name/pages/homepage.dart';
import 'package:name/pages/login_page.dart';
import 'package:flutter/material.dart';
import 'package:name/services/authentication.dart';
enum AuthStatus {
NOT_DETERMINED,
NOT_LOGGED_IN,
LOGGED_IN,
}
class RootPage extends StatefulWidget {
RootPage({this.auth});
final BaseAuth auth;
@override
State<StatefulWidget> createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
AuthStatus authStatus = AuthStatus.NOT_DETERMINED;
String _userId = "";
@override
void initState() {
super.initState();
widget.auth.getCurrentUser().then((user) {
setState(() {
if (user != null) {
_userId = user?.uid;
}
authStatus =
user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN;
});
});
}
void loginCallback() {
widget.auth.getCurrentUser().then((user) {
setState(() {
_userId = user.uid.toString();
authStatus = AuthStatus.LOGGED_IN;
Navigator.of(context).pushReplacementNamed('/');
}); });
}
void logoutCallback() {
setState(() {
authStatus = AuthStatus.NOT_LOGGED_IN;
_userId = "";
});
}
Widget buildWaitingScreen() {
return Scaffold(
body: Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
......
),
);
}
@override
Widget build(BuildContext context) {
switch (authStatus) {
case AuthStatus.NOT_DETERMINED:
return buildWaitingScreen();
break;
case AuthStatus.NOT_LOGGED_IN:
return new LoginSignUpPage(
auth: widget.auth,
loginCallback: loginCallback,
title: "name",
);
break;
case AuthStatus.LOGGED_IN:
if (_userId.length > 0 && _userId != null) {
return new HomePage(
userId: _userId,
auth: widget.auth,
logoutCallback: logoutCallback,
);
} else
return buildWaitingScreen();
break;
default:
return buildWaitingScreen();
}
}
}
将这个类传递给你的 main.dart
home: new RootPage(auth: new Auth())
我有一个具有登录功能的身份验证类。修改此代码以帮助您解决问题。这是getcurrent用户函数
Future<FirebaseUser> getCurrentUser() async {
FirebaseUser user = await _firebaseAuth.currentUser();
return user;
}
【讨论】:
您必须将此数据存储在用户设备中。
shared_preferences 包对此非常有帮助。
SharedPreferences perf = await SharedPreferences.getInstance();
perf.setBool(label, value);
SharedPreferences perf = await SharedPreferences.getInstance();
bool isUserSignedIn = perf.getBool(label);
这里的label 是一个String,它是一个唯一的标识符
有关shared_preferences 包的更多信息,请使用此链接
https://pub.dev/packages/shared_preferences/example
【讨论】: