Flutter 应用程序有时会卡在启动屏幕上

问题描述 投票:0回答:2

在 Android 和 iOS 上,当应用程序一段时间(例如多天)未使用时,或者有时当我恢复最近的应用程序而不是通过图标点击打开应用程序时,该应用程序会在启动屏幕上冻结。

它只是显示一个启动屏幕,其中应用程序是黑色的(因为我有深色主题)和一个应用程序图标,并且它粘在那里。

我唯一的逻辑是初始化 Firebase 并检查用户是否登录。

这是main.dart:

///Receive message when app is in background solution for on message
Future<void> backgroundHandler(RemoteMessage message) async {
  print('Handling a background message ${message.messageId}');
  print('Content of message: ' + message.toString());
}

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  configureInjections();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  FirebaseMessaging.onBackgroundMessage(backgroundHandler);
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) => MultiBlocProvider(
        providers: [
          BlocProvider(create: (context) => getIt<SplashScreenCubit>()),
          BlocProvider(create: (context) => getIt<HomeCubit>()),
          BlocProvider(create: (context) => getIt<LogInCubit>()),
          BlocProvider(create: (context) => getIt<SettingsCubit>())
        ],
        child: OverlaySupport(
          child: MaterialApp(
            debugShowCheckedModeBanner: false,
            title: 'SAY',
            theme: appTheme,
            home: SplashScreenPage(),
          ),
        ),
      );
}

这是启动页面:

class SplashScreenPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => getIt<SplashScreenCubit>()..isUserAuthenticated(),
      child: BlocConsumer<SplashScreenCubit, SplashScreenState>(
          listener: (context, state) {
            if (state is Authenticated) {
              PageNavigator.navigateAndRemoveHistory(context, HomePage());
            }
            if (state is Unauthenticated) {
              PageNavigator.navigateAndRemoveHistory(context, LogInPage());
            }
            if (state is SplashError) {
              PageNavigator.navigateAndRemoveHistory(context, LogInPage());
            }
          },
          builder: (context, state) => SplashScreenContent()),
    );
  }
}

class SplashScreenContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) => Scaffold(
        body: Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          color: AppColors.primaryColor,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Expanded(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    Text('SAY', style: Theme.of(context).textTheme.headline1),
                    Text('Together we make it better!',
                        style: Theme.of(context)
                            .textTheme
                            .headline6!
                            .copyWith(color: AppColors.whiteColor),
                        textAlign: TextAlign.center),
                  ],
                ),
              ),
              Expanded(
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.end,
                  crossAxisAlignment: CrossAxisAlignment.end,
                  children: [Image.asset(SvgIcons.splashScreenLogo)],
                ),
              )
            ],
          ),
        ),
      );
}

这是肘:

@injectable
class SplashScreenCubit extends Cubit<SplashScreenState> {
  final IsUserAuthenticatedUseCase _isUserAuthenticatedUseCase;

  SplashScreenCubit(this._isUserAuthenticatedUseCase) : super(Initial());

  Future<void> isUserAuthenticated() async {
    print("Called isUserAuthenticated on the splash screen");
    try {
      var isUserAuthenticated = await _isUserAuthenticatedUseCase.execute(NoParams());
      return isUserAuthenticated ? emit(Authenticated()) : emit(Unauthenticated());
    } catch (e) {
      emit(Unauthenticated());
    }
  }
}

这是对用例和存储库的调用:

  @override
  Future<bool> isAuthenticated() {
    try {
      var currentUser = _firebaseAuth.currentUser;
      return Future.value(currentUser != null && currentUser.emailVerified);
    } catch (e) {
      return Future.value(false);
    }
  }
flutter firebase firebase-authentication
2个回答
0
投票

好的,在你的

main.dart
中试试这个。首先,我将使用
StreamBuilder
Firebase
方法
userChanges
来检查
auth  state
:

home: StreamBuilder(
          stream: FirebaseAuth.instance.userChanges(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.active) {
              if (snapshot.hasData) {
                return HomePage();
              } else if (snapshot.hasError) {
                return Center(
                  child: Text('${snapshot.error}'),
                );
              }
            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
            return LogInPage();
          },
        ), 


0
投票

我在 Firebase.initializeApp() 中遇到了同样的问题。当我更改选项时,它对我有用。

等待Firebase.initializeApp(选项:FirebaseOptions( apiKey:应用程序密钥, 应用程序 ID:应用程序 ID, 消息发送者 ID:消息发送者 ID, 项目ID: 项目ID ));

替换 google-services.json 文件中的密钥和 ID。它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.