Skip to content

Commit 064345b

Browse files
committed
Fixed Lifecycle updates with regards to hot restart, theme setup seperate file
1 parent 28cf940 commit 064345b

File tree

9 files changed

+108
-52
lines changed

9 files changed

+108
-52
lines changed

app/lib/feature/splash/splash_page_model.dart

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:async';
2+
13
import 'package:flutter/material.dart';
24
import 'package:flutter_errors/flutter_errors.dart';
35
import 'package:injectable/injectable.dart';
@@ -6,12 +8,20 @@ import 'package:statemanagement_riverpod/statemanagement_riverpod.dart';
68
@injectable
79
class SplashViewModel extends BasePageViewModel {
810
final String myBaseUrl;
11+
final StreamController<bool> _navigateToDashboardController =
12+
StreamController();
913
final FlutterExceptionHandlerBinder exceptionHandlerBinder;
14+
late Timer future;
1015

1116
SplashViewModel(@factoryParam this.myBaseUrl, this.exceptionHandlerBinder) {
12-
debugPrint("My First log in Splash $myBaseUrl");
17+
future = Timer(const Duration(seconds: 2), () async {
18+
_navigateToDashboardController.sink.add(true);
19+
_navigateToDashboardController.close();
20+
});
1321
}
1422

23+
Stream<bool> navigateToDashboard() => _navigateToDashboardController.stream;
24+
1525
void test() {
1626
exceptionHandlerBinder.handle(block: () {
1727
debugPrint("exceptionHandlerBinder start");
@@ -37,12 +47,19 @@ class SplashViewModel extends BasePageViewModel {
3747
}).execute();
3848
*/
3949

40-
/* exceptionHandlerBinder.handle(block: () {
50+
/* exceptionHandlerBinder.handle(block: () {
4151
// serverRequest(); // Some dangerous code that can throw an exception
4252
}).catchIt<FormatException>((e) {
4353
// Optional finally block
4454
// Some code
4555
return false;
4656
}).execute();*/
4757
}
58+
59+
@override
60+
void dispose() {
61+
future.cancel();
62+
_navigateToDashboardController.close();
63+
super.dispose();
64+
}
4865
}

app/lib/myapp.dart

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,67 @@
1+
import 'package:app/themes_setup.dart';
12
import 'package:flutter/material.dart';
23
import 'package:localisation/strings.dart';
34
import 'package:responsive_framework/responsive_framework.dart';
45
import 'package:services/services.dart';
6+
57
import 'package:themes/themes.dart';
68

79
import 'navigation/app_router.dart';
810
import 'navigation/route_paths.dart';
911

1012
class MyApp extends StatelessWidget {
11-
const MyApp({Key? key}) : super(key: key);
13+
const MyApp({super.key});
1214

1315
@override
1416
Widget build(BuildContext context) {
1517
return ThemeBuilder(
16-
themes: [
17-
ThemeData(
18-
backgroundColor: Colors.red,
19-
colorScheme: ColorScheme.fromSwatch().copyWith(
20-
secondary: Colors.blue,
21-
brightness: Brightness.light,
22-
)),
23-
],
18+
defaultThemeMode: ThemeMode.system,
19+
themes: getThemes(),
2420
darkTheme: ThemeData(
25-
backgroundColor: Colors.blue[700],
2621
colorScheme: ColorScheme.fromSwatch().copyWith(
22+
background: Colors.blue[700],
2723
secondary: Colors.yellow[700],
2824
brightness: Brightness.dark,
2925
),
3026
),
3127
lightTheme: ThemeData(
32-
backgroundColor: Colors.blue[300],
3328
colorScheme: ColorScheme.fromSwatch().copyWith(
29+
background: Colors.blue[300],
3430
secondary: Colors.yellow[300],
3531
brightness: Brightness.light,
3632
),
3733
),
38-
builder: (context, regularTheme, darkTheme, themeMode) => MaterialApp(
39-
navigatorKey: AppService.navigatorKey,
40-
builder: (context, widget) => ResponsiveWrapper.builder(
41-
ClampingScrollWrapper.builder(context, widget!),
42-
maxWidth: 1400,
43-
minWidth: 360,
44-
defaultScale: true,
45-
breakpoints: [
46-
const ResponsiveBreakpoint.resize(360, name: MOBILE),
47-
const ResponsiveBreakpoint.autoScale(800, name: TABLET),
48-
const ResponsiveBreakpoint.autoScale(1000, name: TABLET),
49-
const ResponsiveBreakpoint.resize(1200, name: DESKTOP),
50-
const ResponsiveBreakpoint.autoScale(2460, name: "4K"),
51-
],
52-
),
53-
localizationsDelegates: const [
54-
Strings.delegate,
55-
GlobalMaterialLocalizations.delegate,
56-
GlobalWidgetsLocalizations.delegate
57-
],
58-
supportedLocales: Strings.delegate.supportedLocales,
59-
onGenerateTitle: (context) => Strings.of(context).appName,
60-
debugShowCheckedModeBanner: false,
61-
initialRoute: RoutePaths.splash,
62-
theme: regularTheme,
63-
darkTheme: darkTheme,
64-
themeMode: themeMode,
65-
onGenerateRoute: AppRouter.generateRoute),
34+
builder: (context, regularTheme, darkTheme, themeMode) {
35+
return MaterialApp(
36+
key: AppService.appKey,
37+
navigatorKey: AppService.navigatorKey,
38+
builder: (context, widget) => ResponsiveWrapper.builder(
39+
ClampingScrollWrapper.builder(context, widget!),
40+
maxWidth: 1400,
41+
minWidth: 360,
42+
defaultScale: true,
43+
breakpoints: [
44+
const ResponsiveBreakpoint.resize(360, name: MOBILE),
45+
const ResponsiveBreakpoint.autoScale(800, name: TABLET),
46+
const ResponsiveBreakpoint.autoScale(1000, name: TABLET),
47+
const ResponsiveBreakpoint.resize(1200, name: DESKTOP),
48+
const ResponsiveBreakpoint.autoScale(2460, name: "4K"),
49+
],
50+
),
51+
localizationsDelegates: const [
52+
Strings.delegate,
53+
GlobalMaterialLocalizations.delegate,
54+
GlobalWidgetsLocalizations.delegate
55+
],
56+
supportedLocales: Strings.delegate.supportedLocales,
57+
onGenerateTitle: (context) => Strings.of(context).appName,
58+
debugShowCheckedModeBanner: false,
59+
initialRoute: RoutePaths.splash,
60+
theme: regularTheme,
61+
darkTheme: darkTheme,
62+
themeMode: themeMode,
63+
onGenerateRoute: AppRouter.generateRoute);
64+
},
6665
);
6766
}
6867
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/// Define application navigation path constants to avoid duplication
22
class RoutePaths {
3-
static const String splash = '/';
3+
static const String splash = '/splash';
44
static const String registration = '/registration';
55
}

app/lib/themes_setup.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:flutter/material.dart';
2+
3+
List<ThemeData> getThemes() {
4+
return [
5+
ThemeData(
6+
textTheme: const TextTheme(
7+
bodyLarge: TextStyle(fontFamily: 'Poppins'),
8+
bodyMedium: TextStyle(fontFamily: 'Poppins'),
9+
bodySmall: TextStyle(fontFamily: 'Poppins'),
10+
displayLarge: TextStyle(fontFamily: 'Poppins'),
11+
displayMedium: TextStyle(fontFamily: 'Poppins'),
12+
displaySmall: TextStyle(fontFamily: 'Poppins'),
13+
titleLarge: TextStyle(fontFamily: 'Poppins'),
14+
titleMedium: TextStyle(fontFamily: 'Poppins'),
15+
titleSmall: TextStyle(fontFamily: 'Poppins'),
16+
labelLarge: TextStyle(fontFamily: 'Poppins'),
17+
labelMedium: TextStyle(fontFamily: 'Poppins'),
18+
labelSmall: TextStyle(fontFamily: 'Poppins'),
19+
),
20+
colorScheme: ColorScheme.fromSwatch().copyWith(
21+
background: Colors.red,
22+
secondary: Colors.blue,
23+
brightness: Brightness.light,
24+
)),
25+
];
26+
}

services/lib/src/app_service.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,9 @@ class AppService {
77
/// Returns the [Get.key] value to be set in the applications navigation
88
static GlobalKey<NavigatorState>? get navigatorKey =>
99
GlobalKey(debugLabel: 'my-app-key');
10+
11+
/// Returns the [Get.key] value to be set in the applications material app
12+
static GlobalKey<State>? get appKey =>
13+
GlobalKey(debugLabel: 'appKey-app-key');
14+
1015
}

statemanagement-core/lib/statemanagement_core.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
library statemanagement_core;
55

66
export 'src/base_page_state.dart';
7+
export 'src/builders_helpers.dart';
8+
79

8-
// TODO: Export any libraries intended for clients of this package.

statemanagement-riverpod/lib/src/base_page.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ abstract class BasePageState<VM extends BasePageViewModel,
1717
}
1818

1919
abstract class BaseStatefulPage<VM extends BasePageViewModel,
20-
B extends BasePage<VM>> extends BasePageState<VM, B> {
20+
B extends BasePage<VM>> extends BasePageState<VM, B> {
2121
@override
2222
Widget build(BuildContext context) {
2323
return BaseWidget<VM>(
@@ -32,22 +32,28 @@ abstract class BaseStatefulPage<VM extends BasePageViewModel,
3232
abstract class BasePageViewWidget<T extends BasePageViewModel> extends Widget {
3333
final ProviderBase<T> providerBase;
3434

35-
BasePageViewWidget(this.providerBase);
35+
BasePageViewWidget(
36+
this.providerBase,
37+
);
3638

3739
@protected
3840
Widget build(BuildContext context, T model);
3941

4042
@override
41-
DataProviderElement<T> createElement() =>
42-
DataProviderElement<T>(this, providerBase);
43+
DataProviderElement<T> createElement() => DataProviderElement<T>(
44+
this,
45+
providerBase,
46+
);
4347
}
4448

4549
class DataProviderElement<T extends BasePageViewModel>
4650
extends ComponentElement {
4751
final ProviderBase<T> providerBase;
4852

49-
DataProviderElement(BasePageViewWidget<T> widget, this.providerBase)
50-
: super(widget);
53+
DataProviderElement(
54+
BasePageViewWidget<T> widget,
55+
this.providerBase,
56+
) : super(widget);
5157

5258
@override
5359
BasePageViewWidget<T> get widget => super.widget as BasePageViewWidget<T>;

statemanagement-riverpod/lib/src/base_widget.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:flutter_riverpod/flutter_riverpod.dart';
3+
import 'package:statemanagement_riverpod/src/base_view_model.dart';
34

45
/// StatefulWidget for T type of ViewModel / ChangeNotifier
5-
class BaseWidget<T extends ChangeNotifier> extends StatefulWidget {
6+
class BaseWidget<T extends BaseViewModel> extends StatefulWidget {
67
final Widget Function(BuildContext context, T? model, Widget? child) builder;
78
final ProviderBase<T> providerBase;
89
final Function(T)? onModelReady;
@@ -21,7 +22,7 @@ class BaseWidget<T extends ChangeNotifier> extends StatefulWidget {
2122
}
2223

2324
/// State of StatefulWidget of T type of Viewmodel / ChangeNotifier
24-
class _BaseWidget<T extends ChangeNotifier> extends State<BaseWidget<T>> {
25+
class _BaseWidget<T extends BaseViewModel> extends State<BaseWidget<T>> {
2526
T? _model;
2627

2728
@override

themes/lib/src/theme_builder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ class _ThemeBuilderState extends State<ThemeBuilder>
9393
case AppLifecycleState.inactive:
9494
break;
9595
case AppLifecycleState.resumed:
96-
adjustSystemThemeIfNecessary();
96+
//Commented until the re-apply bug is solved to avoid restart from start.
97+
//adjustSystemThemeIfNecessary();
9798
break;
9899
case AppLifecycleState.paused:
99100
break;

0 commit comments

Comments
 (0)