Firebase 注销后 Flutter 应用程序崩溃

问题描述

我对 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();
      },);
  }
}

然后我有这个简短的 app.dart 文件

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());

一个 AuthService 文件

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 (将#修改为@)