应用程序正在使用GetX状态管理在重新启动时注销.正常登录,但当重述时,应用程序会失去状态



我对Dart和一般编码都很陌生。我在观看了YouTube上的教程后制作了这段代码。在大多数情况下,我能够自己解决大部分问题,但我无法找出最近的错误。我用GetX和firebase做了一个简单的应用程序。应用程序登录,但当我重新启动时,应用程序会注销。我的目标是用户必须一直呆在主页((上,直到他没有注销为止。注销时,应用程序应转到LandingPage

这是我的身份验证控制器:-

import 'package:definer_lms/views/views.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:flutter/material.dart';
class AuthController extends GetxController {
static AuthController instance = Get.find();
late Rx<User?> _user;
FirebaseAuth auth = FirebaseAuth.instance;
@override
void onReady() {
super.onReady();
_user = Rx<User?>(auth.currentUser);
_user.bindStream(auth.userChanges());
ever(_user, _initialScreen);
}
_initialScreen(User? user) {
if (user == null) {
print("loging Page");
Get.offAll(() => const LandingPage());
} else {
Get.offAll(() => const HomePage());
}
}
void signup(String email, password) async {
try {
await auth.createUserWithEmailAndPassword(
email: email, password: password);
} catch (e) {
Get.snackbar(
"About User",
"User Message",
backgroundColor: Colors.redAccent,
snackPosition: SnackPosition.BOTTOM,
titleText: const Text(
"Account creation failed",
style: TextStyle(color: Colors.white),
),
messageText: Text(
e.toString(),
style: const TextStyle(color: Colors.white),
),
);
}
}
void signIn(String email, password) async {
try {
await auth.signInWithEmailAndPassword(email: email, password: password);
} catch (e) {
Get.snackbar(
"About Login",
"Login Message",
backgroundColor: Colors.redAccent,
snackPosition: SnackPosition.BOTTOM,
titleText: const Text(
"Account login failed",
style: TextStyle(color: Colors.white),
),
messageText: Text(
e.toString(),
style: const TextStyle(color: Colors.white),
),
);
}
}
void logOut() async {
await auth.signOut();
}
}

启动屏幕

import 'dart:async';
import 'package:definer_lms/views/views.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class SplashScreen extends StatefulWidget {
const SplashScreen({Key? key}) : super(key: key);
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
Timer(
Duration(seconds: 3),
() => {
Get.off(LandingPage(), transition: Transition.rightToLeftWithFade)
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xff2AA8A1),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 200,
width: 200,
child: Image.asset('images/dlw.png'),
),
const Padding(
padding: EdgeInsets.only(top: 100),
child: CircularProgressIndicator(
backgroundColor: Color(0xff2AA8A1),
color: Colors.white,
),
)
],
),
),
);
}
}

我的登录页:-

import 'dart:async';
import 'package:flutter/material.dart';
import 'views.dart';
import 'package:get/get.dart';
class LandingPage extends StatefulWidget {
const LandingPage({Key? key}) : super(key: key);
@override
_LandingPageState createState() => _LandingPageState();
}
class _LandingPageState extends State<LandingPage> {

@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Center(
child: SizedBox(
height: 300,
width: 300,
child: Image.asset('images/definerLogo.gif'),
),
),
),
bottomNavigationBar: BottomAppBar(
color: Colors.blueAccent,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
MaterialButton(
onPressed: (){
print('Bottom Button Pressed');
},
child: Text('Browse', style: TextStyle(color: Colors.grey.shade300, fontSize: 20.0),),
),
MaterialButton(
onPressed: (){
Get.to(SignIn());
},
child: Text('Sign In', style: TextStyle(color: Colors.grey.shade300, fontSize: 20.0),),
)
],
),
),
);
}
}

我的主页

import 'package:definer_lms/controllers/authController.dart';
import 'package:flutter/material.dart';
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(onPressed: ()=> AuthController.instance.logOut(), child: Text('Logout'))
],
),
),
);
}
}

登录时运行消息:

[GETX] GOING TO ROUTE /SignIn
I/FirebaseAuth( 6676): [FirebaseAuth:] Preparing to create service connection to 
fallback implementation
W/System  ( 6676): Ignoring header X-Firebase-Locale because its value was null.
W/System  ( 6676): Ignoring header X-Firebase-Locale because its value was null.
D/FirebaseAuth( 6676): Notifying id token listeners about user ( 
lpbfNUpaEIQ9s38FtWmaGTfmFjo1 ).
[GETX] GOING TO ROUTE /HomePage
[GETX] REMOVING ROUTE /SignIn
[GETX] REMOVING ROUTE /LandingPage

重新启动应用后运行消息

Performing hot restart...
Syncing files to device Android SDK built for x86...
Restarted application in 932ms.
W/DynamiteModule( 6676): Local module descriptor class for 
com.google.android.gms.providerinstaller.dynamite not found.
I/DynamiteModule( 6676): Considering local module 
com.google.android.gms.providerinstaller.dynamite:0 and remote module 
com.google.android.gms.providerinstaller.dynamite:0
W/ProviderInstaller( 6676): Failed to load providerinstaller module: No acceptable module com.google.android.gms.providerinstaller.dynamite found. Local version is 0 and remote version is 0.
W/ProviderInstaller( 6676): Failed to report request stats: 
com.google.android.gms.common.security.ProviderInstallerImpl.reportRequestStats [class 
android.content.Context, long, long]
W/ConnectivityManager.CallbackHandler( 6676): callback not found for CALLBACK_AVAILABLE 
message
[GETX] Instance "AuthController" has been created
[GETX] Instance "AuthController" has been initialized
[GETX] Instance "GetMaterialController" has been created
[GETX] Instance "GetMaterialController" has been initialized
[GETX] GOING TO ROUTE /HomePage
[GETX] REMOVING ROUTE /
W/libc    ( 6676): calloc(434055556, 1) failed: returning null pointer
======== Exception caught by image resource service ================================================
The following _Exception was thrown resolving an image frame:
Exception: Codec failed to produce an image, possibly due to invalid image data.
When the exception was thrown, this was the stack: 
Image provider: AssetImage(bundle: null, name: "images/dlw.png")
Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#55b5e(), name: "images/dlw.png", scale: 1.0)

=============================================================================
[GETX] WARNING, consider using: "Get.off(() => Page())" instead of "Get.off(Page())".
Using a widget function instead of a widget fully guarantees that the widget and its 
controllers will be removed from memory when they are no longer used.

[GETX] REPLACE ROUTE /HomePage
[GETX] NEW ROUTE /LandingPage

有人能帮助吗

您可以尝试将AuthController扩展从GetxController更改为GetxService

并在main.dart:上声明AuthController

await Firebase.initializeApp();
await Get.putAsync<AuthController>(
() async => AuthController());

GetxController不同,GetxService在处理页面或使用Get.delete()时不会自动处理。这就是为什么它通常被用作Auth控制的一个例子。

最新更新