首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >App正在使用GetX状态管理重新启动注销。正常登录,但当重声明时,应用程序会失去状态。

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

Stack Overflow用户
提问于 2022-03-04 04:16:31
回答 1查看 758关注 0票数 0

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

这是我的自动控制器:-

代码语言:javascript
运行
复制
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();
 }
 }

溅屏

代码语言:javascript
运行
复制
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,
          ),
        )
      ],
    ),
  ),
);
}
}

我的登陆页:-

代码语言:javascript
运行
复制
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),),
        )
      ],
    ),
  ),
);
}
}

我的主页

代码语言:javascript
运行
复制
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'))

      ],
    ),
  ),
);
}
}

在登录时运行消息:

代码语言:javascript
运行
复制
[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

重新启动应用程序后运行消息

代码语言:javascript
运行
复制
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

有人能帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-04 08:28:02

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

并在AuthController上声明main.dart:

代码语言:javascript
运行
复制
 await Firebase.initializeApp();

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

GetxServiceGetxController不同,它不会在您释放页面或使用Get.delete()时自动释放。这就是为什么它通常被用作Auth控件的一个例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71346551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档