在 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);
}
}
好的,在你的
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();
},
),
我在 Firebase.initializeApp() 中遇到了同样的问题。当我更改选项时,它对我有用。
等待Firebase.initializeApp(选项:FirebaseOptions( apiKey:应用程序密钥, 应用程序 ID:应用程序 ID, 消息发送者 ID:消息发送者 ID, 项目ID: 项目ID ));
替换 google-services.json 文件中的密钥和 ID。它对我有用。