Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/components/my_candidates_municipal_tab.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import '../controller/candidate_data_controller.dart';
import '../controller/data_controller.dart';
import '../controller/pagination_controllers.dart';
import '../views/candidates/add_candidate.dart';
import '../views/splash.dart';
import '../views/splash/splash.dart';
import 'dialog_boxes.dart';
import 'my_candidate_add_button.dart';
import 'my_candidate_selected_card.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/components/my_candidates_national_tab.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:veripol/views/candidates/add_candidate.dart';
import '../controller/candidate_data_controller.dart';
import '../controller/data_controller.dart';
import '../controller/pagination_controllers.dart';
import '../views/splash.dart';
import '../views/splash/splash.dart';
import 'themes.dart';

class MyCandidatesNationalTab extends StatefulWidget {
Expand Down
2 changes: 1 addition & 1 deletion lib/components/my_candidates_provincial_tab.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import '../controller/candidate_data_controller.dart';
import '../controller/data_controller.dart';
import '../controller/pagination_controllers.dart';
import '../views/candidates/add_candidate.dart';
import '../views/splash.dart';
import '../views/splash/splash.dart';
import 'dialog_boxes.dart';
import 'my_candidate_add_button.dart';
import 'my_candidate_selected_card.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/controller/my_candidate_data_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import '../components/my_candidate_selected_card.dart';
import '../components/themes.dart';
import '../models/models.dart';
import '../views/candidates/add_candidate.dart';
import '../views/splash.dart';
import '../views/splash/splash.dart';
import 'pagination_controllers.dart';

class MyCandidatesDataController extends ChangeNotifier {
Expand Down
2 changes: 1 addition & 1 deletion lib/core/routes/routing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:veripol/views/authentication/sign_in.dart';
import 'package:veripol/views/authentication/sign_up1.dart';
import 'package:veripol/views/onboarding/onboarding_1.dart';
import 'package:veripol/views/signup_dashboard.dart';
import 'package:veripol/views/splash.dart';
import 'package:veripol/views/splash/splash.dart';

class Routing {
static final router = GoRouter(
Expand Down
2 changes: 1 addition & 1 deletion lib/main_common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import 'package:veripol/firebase_options.dart';
import 'package:veripol/utils/flavors.dart';
import 'package:veripol/views/dashboard_wrapper.dart';
import 'package:veripol/views/signup_dashboard.dart';
import 'package:veripol/views/splash.dart';
import 'package:veripol/views/splash/splash.dart';

import 'controller/candidate_data_controller.dart';
import 'controller/data_controller.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/views/candidates/candidate_selection.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:veripol/controller/candidate_data_controller.dart';
import 'package:veripol/controller/pagination_controllers.dart';
import 'package:veripol/views/candidates/candidates_list.dart';
import 'package:veripol/views/candidates/position_details.dart';
import 'package:veripol/views/splash.dart';
import 'package:veripol/views/splash/splash.dart';

import '../../components/candidate_type_card_nav.dart';
import '../../components/themes.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/views/dashboard_wrapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:provider/provider.dart';
import 'package:veripol/controller/data_controller.dart';
import 'package:veripol/controller/page_controllers.dart';
import 'package:veripol/models/models.dart';
import 'package:veripol/views/splash.dart';
import 'package:veripol/views/splash/splash.dart';

import '../components/themes.dart';
import '../controller/my_candidate_data_controller.dart';
Expand Down
89 changes: 18 additions & 71 deletions lib/views/splash.dart → lib/views/splash/splash.dart
Original file line number Diff line number Diff line change
@@ -1,101 +1,48 @@
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:veripol/components/themes.dart';
import 'package:veripol/core/extensions/build_extensions.dart';
import 'package:veripol/core/routes/routes.dart';

class VeripolSplash extends StatefulWidget {
const VeripolSplash({super.key});

@override
State<VeripolSplash> createState() => _VeripolSplashState();
}

class _VeripolSplashState extends State<VeripolSplash> with TickerProviderStateMixin {
late AnimationController _breathingAnimation;
late final Animation<double> _breathe = Tween<double>(
begin: 0.8,
end: 1.3,
).animate(
CurvedAnimation(
parent: _breathingAnimation,
curve: Curves.easeOut,
),
);

@override
void initState() {
_breathingAnimation = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 500),
);

WidgetsBinding.instance.addPostFrameCallback((timeStamp) async => await _checkFirstInstall());
part 'use_splash_page.dart';

super.initState();
}

Future<void> _checkFirstInstall() async {
await Future.delayed(const Duration(seconds: 2));
SharedPreferences prefs = await SharedPreferences.getInstance();
final firstInstall = prefs.getBool('firstInstall') ?? true;
if (mounted) {
if (firstInstall) {
context.pushReplacement(Routes.onboarding);
prefs.setBool('firstInstall', false);
} else {
context.pushReplacement(Routes.authHome);
}
}
}

@override
void dispose() {
_breathingAnimation.dispose();
super.dispose();
}
class VeripolSplash extends HookWidget {
const VeripolSplash({super.key});

@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;

final animation = useSplashPage();
return Scaffold(
body: SizedBox(
width: size.width,
height: size.height,
width: context.screenWidth,
height: context.screenHeight,
child: Stack(
alignment: Alignment.center,
children: [
Image.asset(
'assets/bg_pattern.png',
),
Positioned(
left: 134,
top: 307,
child: AnimatedBuilder(
animation: _breathingAnimation..forward(),
builder: (BuildContext context, Widget? child) {
return Transform.scale(
scale: _breathe.value,
child: Image.asset(
'assets/veripol_logo.png',
),
);
},
Transform.scale(
scale: animation,
child: Image.asset(
'assets/veripol_logo.png',
),
),
const Positioned(
left: 221,
left: 300,
top: -261,
child: StackedBoxes(),
child: _StackedBoxes(),
),
Positioned(
left: -195,
top: 565,
child: Transform.rotate(
angle: pi,
child: const StackedBoxes(),
child: const _StackedBoxes(),
),
),
],
Expand All @@ -105,8 +52,8 @@ class _VeripolSplashState extends State<VeripolSplash> with TickerProviderStateM
}
}

class StackedBoxes extends StatelessWidget {
const StackedBoxes({super.key});
class _StackedBoxes extends StatelessWidget {
const _StackedBoxes();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

It's a Flutter best practice to include super.key in widget constructors. This allows the framework to efficiently update and identify widgets. Please add it to the _StackedBoxes constructor.

Suggested change
const _StackedBoxes();
const _StackedBoxes({super.key});


@override
Widget build(BuildContext context) {
Expand Down
38 changes: 38 additions & 0 deletions lib/views/splash/use_splash_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
part of 'splash.dart';

double useSplashPage() {
final context = useContext();
// Using Flutter Hook to manage the breathing animation controller
final breathingAnimation = useAnimationController(
duration: const Duration(milliseconds: 500),
)..forward();

final breathe = useAnimation(Tween<double>(begin: 0.8, end: 1.5).animate(
CurvedAnimation(parent: breathingAnimation, curve: Curves.easeOut),
));

Future<void> checkFirstInstall(BuildContext context) async {
await Future.delayed(const Duration(seconds: 2));
SharedPreferences prefs = await SharedPreferences.getInstance();
final firstInstall = prefs.getBool('firstInstall') ?? true;

if (context.mounted) {
if (firstInstall) {
context.pushReplacement(Routes.onboarding);
prefs.setBool('firstInstall', false);
} else {
context.pushReplacement(Routes.authHome);
}
}
}
Comment on lines +14 to +27

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The checkFirstInstall function is defined inside the useSplashPage hook, which means it gets recreated on every render. For better performance and code organization, this function should be extracted into a private top-level function within this file (e.g., _checkFirstInstall).

Example:

part of 'splash.dart';

double useSplashPage() {
  final context = useContext();
  // ... other hooks

  useEffect(() {
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await _checkFirstInstall(context);
    });
    return null;
  }, []);

  return breathe;
}

Future<void> _checkFirstInstall(BuildContext context) async {
  // ... implementation
}


useEffect(() {
// Trigger the first-install check after the first frame.
WidgetsBinding.instance.addPostFrameCallback((_) async {
await checkFirstInstall(context);
});
return null;
}, []);

return breathe;
}
2 changes: 1 addition & 1 deletion lib/views/veripol_candidates_wrapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'package:veripol/views/registration%20location/registered_voter.dart';
import 'package:veripol/views/splash.dart';
import 'package:veripol/views/splash/splash.dart';

import '../controller/data_controller.dart';
import '../controller/my_candidate_data_controller.dart';
Expand Down