【发布时间】:2021-07-11 11:47:50
【问题描述】:
当我编写 if(user == null) => LoginScreen() 时,屏幕会显示我的登录屏幕,我需要按下登录按钮,这样屏幕才会显示主屏幕 MainScreen()。好消息,这真的很有效。
但我需要用户首先进入欢迎屏幕(当 user == null 时)所以我将 Wrapper() 中的代码从 if(user==null){LoginScreen()} 更改为 if(user= =null){欢迎页面()}。在欢迎屏幕中,如果用户按下登录按钮,用户将被导航到登录页面 (LoginScreen()),然后注册到 RegisterScreen()。
这是 if (if(user == null)=> WelcomeScreen();) 的路径:
WelcomeSceen() => LoginScreen() => MainScreen()
所以问题发生在屏幕显示 WelcomePage() 时,我按下登录按钮导航到 LoginScreen(),然后按下登录按钮(这样我可以导航到 MainScreen())。屏幕没有将我重定向到 MainScreen(),但我的终端中有“用户已登录”(基于我在包装器中编码的内容)。之后我重新启动应用程序时,屏幕会将我重定向到主屏幕。
真的需要知道为什么会发生这种情况,以及如何解决这个问题,这样我仍然可以先向用户显示 WelcomeScreen。
下面是我的代码和目录。
main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:uberclone/models/usermodel.dart';
import 'package:uberclone/services/auth.dart';
import 'package:uberclone/wrapper.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
Firebase.initializeApp();
runApp(App());
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<UserModel?>.value(
value: AuthService().user,
initialData: null,
child: MaterialApp(
debugShowCheckedModeBanner: false,
home: Wrapper(),
),
);
}
}
wrapper.dart(更改前)
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:uberclone/models/usermodel.dart';
import 'package:uberclone/screens/authentication/loginscreen.dart';
import 'package:uberclone/screens/home/mainscreen.dart';
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
@override
Widget build(BuildContext context) {
final user = Provider.of<UserModel?>(context);
print(user);
if (user == null) {
return LoginScreen();
} else {
return MainScreen();
}
}
}
wrapper.dart(更改后)
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:uberclone/models/usermodel.dart';
import 'package:uberclone/screens/authentication/welcomescreen.dart';
import 'package:uberclone/screens/home/mainscreen.dart';
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
@override
Widget build(BuildContext context) {
final user = Provider.of<UserModel?>(context);
print(user);
if (user == null) {
return WelcomeScreen();
} else {
return MainScreen();
}
}
}
auth.dart
import 'package:firebase_auth/firebase_auth.dart';
import 'package:uberclone/models/usermodel.dart';
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
UserModel? _userFromFirebaseUser(User? user) {
return user != null ? UserModel(uid: user.uid) : null;
}
Stream<UserModel?> get user {
return _auth.authStateChanges().map(_userFromFirebaseUser);
}
Future signInAnon() async {
try {
UserCredential result = await _auth.signInAnonymously();
User? user = result.user;
return _userFromFirebaseUser(user);
} catch (e) {
print(e.toString());
return null;
}
}
Future signOut() async {
try {
await _auth.signOut();
} catch (e) {
print(e.toString());
return null;
}
}
}
loginscreen.dart
import 'package:flutter/material.dart';
import 'package:uberclone/screens/authentication/registerscreen.dart';
import 'package:uberclone/screens/authentication/welcomescreen.dart';
import 'package:uberclone/services/auth.dart';
class LoginScreen extends StatefulWidget {
static const String idScreen = 'loginscreen';
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final AuthService _auth = AuthService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 0,
backgroundColor: Colors.white,
leading: IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WelcomeScreen()),
);
},
icon: Icon(Icons.arrow_back_rounded),
color: Colors.black,
),
),
body: SingleChildScrollView(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 5),
child: Column(
children: [
Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Please sign in',
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.normal,
color: Colors.black),
),
SizedBox(height: 20),
Container(
height: 50,
color: Colors.grey[200],
padding:
EdgeInsets.symmetric(horizontal: 10, vertical: 3),
child: TextField(
style: TextStyle(fontSize: 20),
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Email Address',
),
),
),
SizedBox(height: 15),
Container(
height: 50,
color: Colors.grey[200],
padding:
EdgeInsets.symmetric(horizontal: 10, vertical: 3),
child: TextField(
style: TextStyle(fontSize: 20),
obscureText: true,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Password',
),
),
),
SizedBox(height: 2),
TextButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => RegisterScreen()),
);
},
child: Text(
'Dont have any Veko Driver account? Register here',
style:
TextStyle(color: Color(0xff0466c8), fontSize: 15),
))
],
),
),
Container(
padding: EdgeInsets.only(top: 320),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
MaterialButton(
height: 55,
onPressed: () async {
dynamic result = await _auth.signInAnon();
if (result == null) {
print('user has not signed in');
} else {
print('user has signed in');
print(result.uid);
}
},
elevation: 0,
color: Colors.black,
child: Text(
'Log in',
style: TextStyle(color: Colors.white, fontSize: 22),
),
)
],
),
)
],
),
),
),
);
}
}
welcomescreen.dart
import 'package:flutter/material.dart';
import 'package:uberclone/screens/authentication/loginscreen.dart';
import 'package:uberclone/screens/authentication/registerscreen.dart';
import 'package:uberclone/screens/authentication/safetyscreen.dart';
class WelcomeScreen extends StatefulWidget {
static const String idScreen = 'welcomescreen';
@override
_WelcomeScreenState createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Column(
children: <Widget>[
Container(
child: Image.asset('assets/images/veko-rider-coverpage7.jpg')),
Container(
padding: EdgeInsets.only(left: 20, right: 20, top: 15, bottom: 5),
child: Column(
children: <Widget>[
Align(
alignment: Alignment.topLeft,
child: Text(
'Welcome to the Veko',
style: TextStyle(
fontSize: 22,
color: Colors.black,
fontWeight: FontWeight.bold),
),
),
Align(
alignment: Alignment.bottomLeft,
child: Text(
'Driver app',
style: TextStyle(
fontSize: 22,
color: Colors.black,
fontWeight: FontWeight.bold),
),
),
SizedBox(height: 15),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
MaterialButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => LoginScreen()),
);
},
elevation: 0,
color: Colors.black,
height: 40,
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 40, vertical: 10),
child: Text(
'Sign in',
style:
TextStyle(color: Colors.white, fontSize: 18),
),
),
),
SizedBox(width: 10),
MaterialButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => RegisterScreen()),
);
},
elevation: 0,
color: Colors.grey[200],
height: 40,
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 38, vertical: 10),
child: Text(
'Register',
style:
TextStyle(color: Colors.black, fontSize: 18),
),
),
)
],
),
),
],
),
),
Divider(
color: Colors.grey[400],
),
Container(
padding: EdgeInsets.symmetric(horizontal: 15),
child: Row(
children: [
MaterialButton(
padding: EdgeInsets.symmetric(horizontal: 3, vertical: 5),
onPressed: () {
Navigator.pushNamedAndRemoveUntil(
context, SafetyScreen.idScreen, (route) => false);
},
child: Icon(Icons.arrow_back_rounded)),
SizedBox(width: 8),
TextButton(
onPressed: () {},
child: Align(
alignment: Alignment.centerRight,
child: Text(
'or Ride with Veko',
style: TextStyle(fontSize: 18),
),
)),
],
),
)
],
),
),
);
}
}
【问题讨论】:
-
这里方式的代码太多,任何人都无法有效地提供帮助。请花时间单独重现问题。遵循how to create a minimal, complete, verifiable example 中的指导会大大增加有人提供帮助的机会。
标签: firebase flutter authentication firebase-authentication