Rumahjo-Android-APP/lib/Ui/screens/onboarding/onboarding_screen.dart

303 lines
11 KiB
Dart
Raw Normal View History

2024-09-07 00:58:50 +00:00
import 'package:ebroker/utils/Lottie/lottieEditor.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hive/hive.dart';
import 'package:lottie/lottie.dart';
import '../../../app/routes.dart';
import '../../../data/cubits/system/fetch_system_settings_cubit.dart';
import '../../../data/model/system_settings_model.dart';
import '../../../utils/AppIcon.dart';
import '../../../utils/Extensions/extensions.dart';
import '../../../utils/hive_keys.dart';
import '../../../utils/responsiveSize.dart';
import '../../../utils/ui_utils.dart';
class OnboardingScreen extends StatefulWidget {
const OnboardingScreen({Key? key}) : super(key: key);
@override
State<OnboardingScreen> createState() => _OnboardingScreenState();
}
class _OnboardingScreenState extends State<OnboardingScreen> {
int currentPageIndex = 0;
int previousePageIndex = 0;
double changedOnPageScroll = 0.5;
double currentSwipe = 0;
late int totalPages;
final LottieEditor _onBoardingOne = LottieEditor();
final LottieEditor _onBoardingTwo = LottieEditor();
final LottieEditor _onBoardingThree = LottieEditor();
dynamic onBoardingOneData;
dynamic onBoardingTwoData;
dynamic onBoardingThreeData;
@override
void initState() {
_onBoardingOne.openAndLoad("assets/lottie/onbo_a.json");
_onBoardingTwo.openAndLoad("assets/lottie/onbo_b.json");
_onBoardingThree.openAndLoad("assets/lottie/onbo_c.json");
Future.delayed(
Duration.zero,
() {
_onBoardingOne.changeWholeLottieFileColor(context.color.tertiaryColor);
_onBoardingTwo.changeWholeLottieFileColor(context.color.tertiaryColor);
_onBoardingThree
.changeWholeLottieFileColor(context.color.tertiaryColor);
onBoardingOneData = _onBoardingOne.convertToUint8List();
onBoardingTwoData = _onBoardingTwo.convertToUint8List();
onBoardingThreeData = _onBoardingThree.convertToUint8List();
setState(() {});
},
);
Future.delayed(
Duration.zero,
() {
setState(() {});
},
);
super.initState();
}
@override
Widget build(BuildContext context) {
List slidersList = [
{
'lottie': onBoardingOneData,
'title': UiUtils.translate(context, "onboarding_1_title"),
'description': UiUtils.translate(context, "onboarding_1_description"),
'button': 'next_button.svg'
},
{
'lottie': onBoardingTwoData,
'title': UiUtils.translate(context, "onboarding_2_title"),
'description': UiUtils.translate(context, "onboarding_2_description"),
},
{
'lottie': onBoardingThreeData,
'title': UiUtils.translate(context, "onboarding_3_title"),
'description': UiUtils.translate(context, "onboarding_3_description"),
},
];
totalPages = slidersList.length;
return AnnotatedRegion(
value: const SystemUiOverlayStyle(
systemNavigationBarColor: Colors.transparent,
statusBarColor: Colors.transparent,
),
child: Scaffold(
backgroundColor: context.color.backgroundColor,
body: Stack(
children: <Widget>[
Container(
color: context.color.tertiaryColor.withOpacity(0.25),
),
Align(
alignment: Alignment.center.add(const Alignment(0, -.3)),
child: SizedBox(
height: 300,
child: (slidersList[currentPageIndex]['lottie'] != null)
? Lottie.memory(
slidersList[currentPageIndex]['lottie'],
delegates: LottieDelegates(
values: [],
),
)
: Container(),
)),
PositionedDirectional(
top: kPagingTouchSlop,
start: 5,
child: TextButton(
onPressed: () async {
context
.read<FetchSystemSettingsCubit>()
.fetchSettings(isAnonymouse: true);
Navigator.pushNamed(
context, Routes.languageListScreenRoute);
},
child: StreamBuilder(
stream: Hive.box(HiveKeys.languageBox)
.watch(key: HiveKeys.currentLanguageKey),
builder: (context, AsyncSnapshot<BoxEvent> value) {
if (value.data?.value == null) {
if (context
.watch<FetchSystemSettingsCubit>()
.getSetting(SystemSetting.defaultLanguage)
.toString() ==
"null") {
return const Text("");
}
return Text(context
.watch<FetchSystemSettingsCubit>()
.getSetting(SystemSetting.defaultLanguage)
.toString()
.firstUpperCase())
.color(context.color.textColorDark);
} else {
return Text(value.data!.value!['code']
.toString()
.toString()
.firstUpperCase())
.color(context.color.textColorDark);
}
}))),
PositionedDirectional(
top: kPagingTouchSlop,
end: 5,
child: GestureDetector(
onTap: () {
Navigator.pushReplacementNamed(context, Routes.login);
},
child: Padding(
padding: const EdgeInsets.all(14.0),
child: Icon(
Icons.close,
color: context.color.tertiaryColor,
),
),
)),
Positioned(
bottom: 0,
child: GestureDetector(
onHorizontalDragUpdate: (DragUpdateDetails details) {
currentSwipe = details.localPosition.direction;
setState(() {});
},
onHorizontalDragEnd: (details) {
if (currentSwipe < 0.5) {
if (changedOnPageScroll == 1 ||
changedOnPageScroll == 0.5) {
if (currentPageIndex > 0) {
currentPageIndex--;
changedOnPageScroll = 0;
}
}
setState(() {});
} else {
if (currentPageIndex < totalPages) {
if (changedOnPageScroll == 0 ||
changedOnPageScroll == 0.5) {
if (currentPageIndex < slidersList.length - 1) {
currentPageIndex++;
} else {
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.login, (route) => false);
}
setState(() {});
}
}
}
changedOnPageScroll = 0.5;
setState(() {});
},
child: Container(
height: 304.rh(context),
width: context.screenWidth,
decoration: BoxDecoration(
color: context.color.primaryColor,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(40),
topRight: Radius.circular(40)),
),
child: Padding(
padding: const EdgeInsets.only(
right: 20, left: 20, bottom: 20, top: 10),
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Padding(
padding: const EdgeInsets.all(15.0),
child: Text(slidersList[currentPageIndex]['title'],
key: const Key("onboarding_title"))
.size(context.font.extraLarge.rf(context))
.color(context.color.tertiaryColor)
.bold(weight: FontWeight.w600),
),
Text(
slidersList[currentPageIndex]['description'],
textAlign: TextAlign.center,
)
.setMaxLines(lines: 3)
.size(context.font.larger.rf(context))
.color(context.color.textColorDark),
const Spacer(),
Row(
children: [
Row(children: [
for (var i = 0; i < slidersList.length; i++) ...[
buildIndicator(context,
selected: i == currentPageIndex)
],
]),
const Spacer(),
GestureDetector(
key: const ValueKey("next_screen"),
onTap: () {
if (currentPageIndex < slidersList.length - 1) {
currentPageIndex++;
} else {
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.login, (route) => false);
}
setState(() {});
},
child: CircleAvatar(
radius: 35,
backgroundColor: context.color.tertiaryColor,
child: UiUtils.getSvg(AppIcons.iconArrowLeft),
),
)
],
)
],
),
),
),
),
)
],
),
),
);
}
Widget buildIndicator(BuildContext context, {required bool selected}) {
if (selected) {
return Padding(
padding: const EdgeInsets.all(1.0),
child: Container(
width: 36,
height: 12,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7),
color: context.color.tertiaryColor,
),
),
);
} else {
return Padding(
padding: const EdgeInsets.all(1.0),
child: Container(
width: 12,
height: 12,
decoration: BoxDecoration(
shape: BoxShape.circle,
border:
Border.all(color: context.color.textLightColor, width: 1.9)),
),
);
}
}
}