I’m developing an application with Flutter. But there is a problem. When I Hot Reload, the application starts from the beginning.
My main.dart
:
void main() async {
await setup();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => ThemeManager.instance),
],
child: const MyApp(),
),
);
}
Future<void> setup() async {
WidgetsFlutterBinding.ensureInitialized();
await HiveService.instance.init();
await DioService.instance.init();
await ThemeManager.instance.initTheme();
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
print("started"); // started
AppRouter _appRouter = AppRouter();
return MaterialApp.router(
debugShowCheckedModeBanner: false,
title: AppConstants.appName,
themeMode: context.themeMode,
theme: context.theme,
darkTheme: context.theme,
routerConfig: _appRouter.config(),
scaffoldMessengerKey: GlobalKey<ScaffoldMessengerState>(),
);
}
}
Splash View:
@RoutePage()
class SplashView extends StatelessWidget {
const SplashView({super.key});
@override
Widget build(BuildContext context) {
return BaseView<SplashBloc, SplashState>(
bloc: SplashBloc()..add(SplashCheckSkippedEvent(context: context)),
onPageBuilder: (context, cubit, state) {
return Scaffold(
body: Container(
decoration: _containerDecoration(),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
TransferGoalLogo(
theme: LogoTheme.light,
width: context.dynamicWidth(0.8),
),
context.emptySizedHeightNormal,
const Center(
child: CircularProgressIndicator(),
),
],
),
),
);
},
);
}
BoxDecoration _containerDecoration() {
return BoxDecoration(
image: DecorationImage(
image: AssetImage(ImageConstants.instance.splashBackground),
fit: BoxFit.cover,
opacity: 0.5,
),
gradient: const LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Colors.black87,
Colors.black54,
Colors.black45,
],
),
);
}
}
SplashBloc:
part 'splash_event.dart';
part 'splash_state.dart';
class SplashBloc extends Bloc<SplashEvent, SplashState> {
SplashService splashService = SplashService();
SplashBloc() : super(SplashInitialState()) {
on<SplashCheckSkippedEvent>(_checkSkippedOnboard);
on<SplashNavigateToLatestTransfersEvent>(_onNavigateToLatestTransfers);
on<SplashNavigateToOnboardEvent>(_navigateToOnboard);
}
Future<void> _checkSkippedOnboard(SplashCheckSkippedEvent event, Emitter<SplashState> emit) async {
final bool isSkipped = await splashService.checkSkippedOnboard();
if (isSkipped) {
add(SplashNavigateToLatestTransfersEvent(context: event.context));
} else {
add(SplashNavigateToOnboardEvent(context: event.context));
}
}
void _navigateToOnboard(SplashNavigateToOnboardEvent event, Emitter<SplashState> emit) {
NavigationHelper.pushAndRemoveUntil(event.context, route: const OnboardView());
}
void _onNavigateToLatestTransfers(SplashNavigateToLatestTransfersEvent event, Emitter<SplashState> emit) {
NavigationHelper.pushAndRemoveUntil(event.context, route: LatestTransfersView());
}
}
SplashEvent and State:
part of 'splash_bloc.dart';
sealed class SplashEvent extends Equatable {
const SplashEvent();
@override
List<Object> get props => [];
}
final class SplashCheckSkippedEvent extends SplashEvent {
final BuildContext context;
const SplashCheckSkippedEvent({required this.context});
}
final class SplashNavigateToOnboardEvent extends SplashEvent {
final BuildContext context;
const SplashNavigateToOnboardEvent({required this.context});
}
final class SplashNavigateToLatestTransfersEvent extends SplashEvent {
final BuildContext context;
const SplashNavigateToLatestTransfersEvent({required this.context});
}
sealed class SplashState extends Equatable {
const SplashState();
@override
List<Object> get props => [];
}
final class SplashInitialState extends SplashState {}
final class SplashLoadedState extends SplashState {}
final class SplashSkippedState extends SplashState {}
final class SplashNotSkippedState extends SplashState {}
and BaseView:
typedef WidgetBuilderCallback<C extends BlocBase<S>, S> = Widget Function(
BuildContext context, C cubit, S state);
typedef OnReadyCallback<C> = void Function(C cubit);
class BaseView<C extends BlocBase<S>, S> extends StatefulWidget {
final WidgetBuilderCallback<C, S> onPageBuilder;
final OnReadyCallback<C>? onReady;
final C? cubit;
final BlocBase<S>? bloc;
const BaseView({
super.key,
required this.onPageBuilder,
this.onReady,
this.cubit,
this.bloc,
}) : assert(cubit != null || bloc != null, 'Cubit or Bloc must be provided');
@override
State<BaseView<C, S>> createState() => _BaseViewState<C, S>();
}
class _BaseViewState<C extends BlocBase<S>, S> extends State<BaseView<C, S>> {
late final C _cubit;
@override
void initState() {
super.initState();
if (widget.cubit != null) {
_cubit = widget.cubit!;
widget.onReady?.call(_cubit);
} else {
_cubit = widget.bloc as C;
}
}
@override
void dispose() {
_cubit.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return BlocProvider<C>(
create: (context) => _cubit,
child: BlocBuilder<C, S>(
builder: (context, state) => widget.onPageBuilder(context, _cubit, state),
),
);
}
}
How can I solve this problem? I developing with iOS and Android. I looked at other support topics on the internet but couldn’t find a solution. Thanks for help.
2