Browse Source

add: intro videos

pull/54/head
AmirrezaChegini 2 weeks ago
parent
commit
686395f80b
  1. BIN
      assets/videos/intro_1.mp4
  2. BIN
      assets/videos/intro_2.mp4
  3. BIN
      assets/videos/intro_3.mp4
  4. BIN
      assets/videos/intro_4.mp4
  5. BIN
      assets/videos/intro_5.mp4
  6. 75
      lib/features/intro/presentation/bloc/intro_bloc.dart
  7. 4
      lib/features/intro/presentation/bloc/intro_event.dart
  8. 2
      lib/features/intro/presentation/ui/intro_page.dart
  9. 54
      lib/features/intro/presentation/ui/screens/intro_1_screen.dart
  10. 38
      lib/features/intro/presentation/ui/screens/intro_2_screen.dart
  11. 38
      lib/features/intro/presentation/ui/screens/intro_3_screen.dart
  12. 37
      lib/features/intro/presentation/ui/screens/intro_4_screen.dart
  13. 35
      lib/features/intro/presentation/ui/screens/intro_5_screen.dart
  14. 1
      pubspec.yaml

BIN
assets/videos/intro_1.mp4

BIN
assets/videos/intro_2.mp4

BIN
assets/videos/intro_3.mp4

BIN
assets/videos/intro_4.mp4

BIN
assets/videos/intro_5.mp4

75
lib/features/intro/presentation/bloc/intro_bloc.dart

@ -14,11 +14,24 @@ import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_2
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_3_screen.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_4_screen.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_5_screen.dart';
import 'package:pod_player/pod_player.dart';
class IntroBloc extends Bloc<IntroEvent, IntroState> {
/// ------------constructor------------
IntroBloc() : super(const IntroState()){
on<ChangeIntroEvent>(_changeIntroEvent);
IntroBloc() : super(const IntroState()) {
initVideos();
on<InitVideosEvent>(_initVideosEvent);
on<ChangeVideosEvent>(_changeVideosEvent);
}
@override
Future<void> close() {
podController1.dispose();
podController2.dispose();
podController3.dispose();
podController4.dispose();
podController5.dispose();
return super.close();
}
/// ------------UseCases------------
@ -33,6 +46,21 @@ class IntroBloc extends Bloc<IntroEvent, IntroState> {
];
/// ------------Controllers------------
final PodPlayerController podController1 = PodPlayerController(
playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_1.mp4'),
);
final PodPlayerController podController2 = PodPlayerController(
playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_2.mp4'),
);
final PodPlayerController podController3 = PodPlayerController(
playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_3.mp4'),
);
final PodPlayerController podController4 = PodPlayerController(
playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_4.mp4'),
);
final PodPlayerController podController5 = PodPlayerController(
playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_5.mp4'),
);
/// ------------Functions------------
Future<void> goToHomePage() async {
@ -43,11 +71,46 @@ class IntroBloc extends Bloc<IntroEvent, IntroState> {
}
/// ------------Api Calls------------
FutureOr<void> _changeIntroEvent(ChangeIntroEvent event, Emitter emit) async {
if (state.currentIntro < intros.length - 1) {
emit(state.copyWith(currentIntro: state.currentIntro + 1));
} else {
FutureOr<void> _changeVideosEvent(ChangeVideosEvent event, Emitter emit) async {
switch (state.currentIntro) {
case 0:
podController2.play();
emit(state.copyWith(currentIntro: 1));
break;
case 1:
podController3.play();
emit(state.copyWith(currentIntro: 2));
break;
case 2:
podController4.play();
emit(state.copyWith(currentIntro: 3));
break;
case 3:
podController5.play();
emit(state.copyWith(currentIntro: 4));
break;
case 4:
goToHomePage();
break;
}
}
Future<void> initVideos() async {
await Future.wait([
podController1.initialise(),
podController2.initialise(),
podController3.initialise(),
podController4.initialise(),
podController5.initialise(),
]);
podController1.play();
add(InitVideosEvent());
}
FutureOr<void> _initVideosEvent(
InitVideosEvent event,
Emitter<IntroState> emit,
) async {
emit(state.copyWith(currentIntro: 0));
}
}

4
lib/features/intro/presentation/bloc/intro_event.dart

@ -2,4 +2,6 @@ sealed class IntroEvent {
const IntroEvent();
}
class ChangeIntroEvent extends IntroEvent {}
class InitVideosEvent extends IntroEvent {}
class ChangeVideosEvent extends IntroEvent {}

2
lib/features/intro/presentation/ui/intro_page.dart

@ -16,7 +16,7 @@ class IntroPage extends StatelessWidget {
return Scaffold(
body: SizedBox.expand(
child: GestureDetector(
onTap: () => context.read<IntroBloc>().add(ChangeIntroEvent()),
onTap: () => context.read<IntroBloc>().add(ChangeVideosEvent()),
child: Stack(
children: [
_mainScreen(),

54
lib/features/intro/presentation/ui/screens/intro_1_screen.dart

@ -1,54 +1,24 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart';
import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:pod_player/pod_player.dart';
class Intro1Screen extends StatelessWidget {
const Intro1Screen({super.key});
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
Positioned.fill(
child: MyImage(image: MyAssets.intro_1, fit: BoxFit.cover),
return SizedBox.expand(
child: PodVideoPlayer(
controller: context.read<IntroBloc>().podController1,
overlayBuilder: (options) => SizedBox.shrink(),
alwaysShowProgressBar: false,
videoAspectRatio: context.widthScreen / context.heightScreen,
frameAspectRatio: context.widthScreen / context.heightScreen,
backgroundColor: Color(0XFF00154C),
onLoading: (context) => SizedBox.shrink(),
),
PositionedDirectional(
end: setSize<double>(
context: context,
mobile: MySpaces.s10,
tablet: 0.15.w,
),
top: setSize<double>(
context: context,
mobile: 0.15.h,
tablet: 0.25.h,
),
width: 290,
child: SlideUpFade(
delay: Duration(milliseconds: 300),
child: BubbleChatWidget(
text: context.translate.intro_1_1,
flip: true,
),
),
),
PositionedDirectional(
start: setSize(context: context, mobile: MySpaces.s30, tablet: 0.2.w),
top: setSize(context: context, mobile: 0.3.h, tablet: 0.35.h),
width: 250,
child: SlideUpFade(
delay: Duration(milliseconds: 800),
child: BubbleChatWidget(text: context.translate.intro_1_2),
),
),
],
);
}
}

38
lib/features/intro/presentation/ui/screens/intro_2_screen.dart

@ -1,37 +1,25 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart';
import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:pod_player/pod_player.dart';
class Intro2Screen extends StatelessWidget {
const Intro2Screen({super.key});
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
Positioned.fill(
child: Transform.flip(
flipX: true,
child: MyImage(image: MyAssets.intro_2, fit: BoxFit.cover),
return SizedBox.expand(
child: PodVideoPlayer(
controller: context.read<IntroBloc>().podController2,
overlayBuilder: (options) => SizedBox.shrink(),
alwaysShowProgressBar: false,
videoAspectRatio: context.widthScreen / context.heightScreen,
frameAspectRatio: context.widthScreen / context.heightScreen,
backgroundColor: MyColors.transparent,
onLoading: (context) => SizedBox.shrink(),
),
),
PositionedDirectional(
end: setSize(context: context, mobile: MySpaces.s40, tablet: 0.3.w),
top: setSize(context: context, mobile: 0.17.h, tablet: 0.23.h),
width: 250,
child: SlideUpFade(
delay: Duration(milliseconds: 300),
child: BubbleChatWidget(text: context.translate.intro_2),
),
),
],
);
}
}

38
lib/features/intro/presentation/ui/screens/intro_3_screen.dart

@ -1,37 +1,25 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart';
import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:pod_player/pod_player.dart';
class Intro3Screen extends StatelessWidget {
const Intro3Screen({super.key});
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
Positioned.fill(
child: MyImage(image: MyAssets.intro_3, fit: BoxFit.cover),
return SizedBox.expand(
child: PodVideoPlayer(
controller: context.read<IntroBloc>().podController3,
overlayBuilder: (options) => SizedBox.shrink(),
alwaysShowProgressBar: false,
videoAspectRatio: context.widthScreen / context.heightScreen,
frameAspectRatio: context.widthScreen / context.heightScreen,
backgroundColor: MyColors.transparent,
onLoading: (context) => SizedBox.shrink(),
),
PositionedDirectional(
start: setSize(context: context, mobile: MySpaces.s30),
top: setSize(context: context, mobile: 180, tablet: 0.25.h),
width: 270,
child: SlideUpFade(
delay: Duration(milliseconds: 300),
child: BubbleChatWidget(
text: context.translate.intro_3,
flip: true,
),
),
),
],
);
}
}

37
lib/features/intro/presentation/ui/screens/intro_4_screen.dart

@ -1,36 +1,25 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart';
import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:pod_player/pod_player.dart';
class Intro4Screen extends StatelessWidget {
const Intro4Screen({super.key});
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
Positioned.fill(
child: MyImage(image: MyAssets.intro_4, fit: BoxFit.cover),
return SizedBox.expand(
child: PodVideoPlayer(
controller: context.read<IntroBloc>().podController4,
overlayBuilder: (options) => SizedBox.shrink(),
alwaysShowProgressBar: false,
videoAspectRatio: context.widthScreen / context.heightScreen,
frameAspectRatio: context.widthScreen / context.heightScreen,
backgroundColor: MyColors.transparent,
onLoading: (context) => SizedBox.shrink(),
),
PositionedDirectional(
start: setSize(context: context, mobile: MySpaces.s10, tablet: 0.2.w),
bottom: setSize(context: context, mobile: 0.4.h, tablet: 0.4.h),
width: 237,
child: SlideUpFade(
delay: Duration(milliseconds: 300),
child: BubbleChatWidget(
text: context.translate.intro_4,
),
),
),
],
);
}
}

35
lib/features/intro/presentation/ui/screens/intro_5_screen.dart

@ -1,34 +1,25 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart';
import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:pod_player/pod_player.dart';
class Intro5Screen extends StatelessWidget {
const Intro5Screen({super.key});
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
Positioned.fill(
child: MyImage(image: MyAssets.intro_5, fit: BoxFit.cover),
return SizedBox.expand(
child: PodVideoPlayer(
controller: context.read<IntroBloc>().podController5,
overlayBuilder: (options) => SizedBox.shrink(),
alwaysShowProgressBar: false,
videoAspectRatio: context.widthScreen / context.heightScreen,
frameAspectRatio: context.widthScreen / context.heightScreen,
backgroundColor: MyColors.transparent,
onLoading: (context) => SizedBox.shrink(),
),
PositionedDirectional(
top: setSize(context: context, mobile: 0.37.h, tablet: 0.42.h),
width: 200,
child: SlideUpFade(
delay: Duration(milliseconds: 300),
child: BubbleChatWidget(
text: context.translate.intro_5,
),
),
),
],
);
}
}

1
pubspec.yaml

@ -51,6 +51,7 @@ flutter:
- assets/images/
- assets/animations/
- assets/audios/
- assets/videos/
- path: assets/svg/
transformers:
- package: vector_graphics_compiler

Loading…
Cancel
Save