[英]Flutter app stuck sometimes on the Splash screen
The app freezes on Android and iOS on the Splash screen when the app is not used for some time, like multiple days, or sometimes when I resume the recent apps, instead of opening the app on the icon tap.当应用程序一段时间未使用时(例如多天)或有时当我恢复最近的应用程序时,应用程序会在启动屏幕上的 Android 和 iOS 处冻结,而不是在图标点击时打开应用程序。
It just displays a splash screen with the app being black (since I have the dark theme) and an app icon and it sticks there.它只是显示一个启动画面,应用程序是黑色的(因为我有深色主题)和一个应用程序图标,它会粘在那里。
The only logic that I have is to init Firebase and to check if user is logged in.我唯一的逻辑是初始化 Firebase 并检查用户是否登录。
Here is the main.dart:这是 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(),
),
),
);
}
Here is the Splash page:这是启动页面:
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)],
),
)
],
),
),
);
}
Here is the cubit:这是肘:
@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());
}
}
}
Here is the call to the use case and repository:这是对用例和存储库的调用:
@override
Future<bool> isAuthenticated() {
try {
var currentUser = _firebaseAuth.currentUser;
return Future.value(currentUser != null && currentUser.emailVerified);
} catch (e) {
return Future.value(false);
}
}
Okay try this in your main.dart
.好的,在你的main.dart
试试这个。 First I'm gonna use StreamBuilder
and the Firebase
method userChanges
to check the auth state
:首先,我将使用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();
},
),
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.