我试图在登录后导航到主页,这可行,我遵循了这个教程:
https://www.youtube.com/watch?v=oJ5Vrya3wCQ&t=307s
但是,我的问题是,当我去注册按钮>注册用户时,我直接进入登录页面,但是当我填写登录表单并登录时,什么也没发生,我必须做一个“热重启”才能看到我的主页,就好像某些小部件没有重建一样。所以我应该做任何更好的清洁方法来进行状态管理?
主要:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:plantsapp/screens/login_page.dart';
import 'package:plantsapp/screens/plant_screen.dart';
import 'package:plantsapp/screens/register_page.dart';
import 'package:plantsapp/screens/shop_scree_page.dart';
import 'package:plantsapp/services/authentication_service.dart';
import 'package:provider/provider.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<AuthenticationService>(
create: (_) => AuthenticationService(FirebaseAuth.instance),
),
StreamProvider(create: (context) => context.read<AuthenticationService>().authStateChanges)
],
child: MaterialApp(
title: 'Flutter Plant Shop UI',
debugShowCheckedModeBanner: false,
home: AuthenticationWrapper(),
routes: {
'registerpage': (context) => RegisterPage(),
'loginpage': (context) => LoginPage(),
'homepage': (context) => PlantScreen(),
},
//theme: ThemeData.dark(),
),
);
}
}
// ignore: must_be_immutable
class AuthenticationWrapper extends StatelessWidget with ChangeNotifier{
@override
Widget build(BuildContext context) {
final firebaseuser = context.watch<User>();
notifyListeners();
if(firebaseuser != null) {
notifyListeners();
return ShopScreen();
} else {
notifyListeners();
return LoginPage();
}
}
}
认证服务:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
class AuthenticationService with ChangeNotifier{
final FirebaseAuth _firebaseAuth;
AuthenticationService(this._firebaseAuth);
Stream<User> get authStateChanges => _firebaseAuth.authStateChanges();
Future<String> signIn({String email, String password}) async {
try {
await _firebaseAuth.signInWithEmailAndPassword(email: email, password: password);
notifyListeners();
return "Signed in";
} on FirebaseAuthException catch (e) {
print(e);
return e.message;
}
}
Future<String> signUp({String email, String password, BuildContext context}) async{
try {
await _firebaseAuth.createUserWithEmailAndPassword(email: email, password: password);
print('USUARIO REGISTRADO');
Navigator.pushReplacementNamed(context, 'loginpage');
return "Signed Up";
} on FirebaseAuthException catch (e) {
print(e.message);
return e.message;
}
}
Future<void> signOut() async{
await _firebaseAuth.signOut();
notifyListeners();
}
}
登录页:
import 'package:flutter/material.dart';
import 'package:plantsapp/services/authentication_service.dart';
import 'package:provider/provider.dart';
class LoginPage extends StatefulWidget{
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage>{
final TextEditingController emailController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Container(
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 80),
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 80),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Login',
style: TextStyle(fontSize: 20),
),
_emailForm(),
_passwordForm(),
_button(),
_buttonRegister(),
],
),
),
),
);
}
Widget _emailForm() {
return TextField(
controller: emailController,
decoration: InputDecoration(hintText: ('Email')),
);
}
Widget _passwordForm() {
return TextField(
controller: passwordController,
decoration: InputDecoration(hintText: ('Password')),
);
}
Widget _button() {
return RaisedButton(
child: Text('Login'),
onPressed: () {
Provider.of<AuthenticationService>(context, listen: false).signIn(
email: emailController.text.trim(),
password: passwordController.text.trim());
},
);
}
_buttonRegister() {
return RaisedButton(
child: Text('Registrarse'),
onPressed: () {
Navigator.pushReplacementNamed(context, 'registerpage');
},
);
}
}
RegisterPage:
import 'package:flutter/material.dart';
import 'package:plantsapp/services/authentication_service.dart';
import 'package:provider/provider.dart';
class RegisterPage extends StatefulWidget {
RegisterPage({Key key}) : super(key: key);
@override
_RegisterPageState createState() => _RegisterPageState();
}
class _RegisterPageState extends State<RegisterPage> {
final TextEditingController emailController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Container(
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 80),
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 80),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Registrarse',
style: TextStyle(fontSize: 30),
),
_emailForm(),
_passwordForm(),
_button(),
],
),
),
),
);
}
Widget _emailForm() {
return TextField(
controller: emailController,
decoration: InputDecoration(hintText: ('Email')),
);
}
Widget _passwordForm() {
return TextField(
controller: passwordController,
decoration: InputDecoration(hintText: ('Password')),
);
}
Widget _button() {
return RaisedButton(
child: Text('Registrarse'),
onPressed: () {
Provider.of<AuthenticationService>(context, listen: false).signUp(
email: emailController.text.trim(),
password: passwordController.text.trim(),
context: context);
},
);
}
}
我发现了问题,我想与所有人分享。问题是导航器,您必须保持流程,我的应用程序在LoginPage上启动,所以我使用导航器转到RegisterPage,因此,我在RegisterPage中启动了该应用程序,而没有使用任何导航器进行测试,它向我发送了自动进入首页。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句