问题描述
我对 Flutter 还是很陌生。我正在将 Riverpod 与 Firebase 一起使用,并在尝试注销后出现崩溃。如果有人可以提供帮助,那就太棒了!如果这只是一个菜鸟错误,我已经很抱歉了:D
我的 main.dart 看起来像这样:
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(ProviderScope(child: App()));
}
class App extends StatelessWidget {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
return FutureBuilder(
// Initialize FlutterFire
future: _initialization,builder: (context,snapshot) {
// Check for Errors
if (snapshot.hasError) {
return Center(child: Text("Error"));
}
// Once complete,show application
if (snapshot.connectionState == ConnectionState.done) {
return MaterialApp(
home: MyApp(),darkTheme: ThemeData.dark(),);
}
// Otherwise,show loadin while waiting for init to complete
return LoadingScreen();
},);
}
}
class MyApp extends ConsumerWidget {
@override
Widget build(BuildContext context,ScopedReader watch) {
final userAsyncValue = watch(authStateChangesProvider);
return userAsyncValue.when(
data: (user) {
if (user == null) {
return LoginScreen();
} else {
return HomeScreen();
}
},loading: () => CircularProgressIndicator(),error: (_,__) => Container());
}
}
final firebaseAuthProvider = Provider<FirebaseAuth>((ref) => FirebaseAuth.instance);
final authStateChangesProvider = StreamProvider<User?>((ref) => ref.watch(firebaseAuthProvider).authStateChanges());
class AuthenticationService {
final _auth = FirebaseAuth.instance;
Future logInWithEmailAndPassword(email,password) async {
try {
await _auth.signInWithEmailAndPassword(email: email,password: password);
} on FirebaseAuthException catch (e) {
print(e.message);
}
}
Future logout() async {
await _auth.signOut();
}
}
class LoginScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final _formKey = GlobalKey<FormState>();
final _inputService = InputService();
final _emailcontroller = TextEditingController();
final _passwordcontroller = TextEditingController();
final _auth = AuthenticationService();
return Form(
key: _formKey,child: Scaffold(
backgroundColor: Colors.black,body: Padding(
padding: const EdgeInsets.all(16.0),child: Column(
mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
TextFormField(
decoration: Inputdecoration(hintText: "Email",hintStyle: TextStyle(color: Colors.white)),controller: _emailcontroller,style: TextStyle(color: Colors.white),keyboardType: TextInputType.emailAddress,validator: (value) => _inputService.isInputValid(value,"email")),TextFormField(
decoration: Inputdecoration(hintText: "Password",obscureText: true,controller: _passwordcontroller,"password"),),ElevatedButton(
onpressed: () {
if (_formKey.currentState!.validate()) {
_auth.logInWithEmailAndPassword(_emailcontroller.text,_passwordcontroller.text);
}
},child: Text(
"Login",style: TextStyle(
fontSize: 20,)),],);
}
}
和一个真正简单的主屏幕
class HomeScreen extends StatelessWidget {
final _auth = AuthenticationService();
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,body: Column(
mainAxisAlignment: MainAxisAlignment.center,children: [
ElevatedButton(
onpressed: () {
_auth.logout();
},child: Text(
"logout",))
],));
}
}
登录就像一个魅力,但一旦我退出应用程序就会崩溃,如果你告诉我如何在 vscode 中找到更多调试信息,我就会退出(sigterm),我很乐意提供它:D
此外,它实际上似乎正确地让我退出了 Firebase,至少在模拟器上重新打开应用程序时,我回到了登录屏幕。所以我猜它与 MyApp 类中的 ConsumerWidget 的身份验证状态更改和重建有关吗?
如果有人能帮忙就好了!如果您认为我的代码总体上很糟糕,请乐于纠正我,我只是想将我在教程中找到的内容放在一起,并且总是很高兴得到纠正:D
编辑:
environment:
sdk: ">=2.12.0 <3.0.0"
dependencies:
Flutter:
sdk: Flutter
firebase_core: "^1.0.1"
firebase_auth: "^1.0.1"
Flutter_riverpod: "^0.13.1+1"
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)