Browse Source

fix: precache images

pull/20/head
AmirrezaChegini 3 weeks ago
parent
commit
4673760836
  1. 58
      lib/common_ui/resources/my_assets.dart
  2. 65
      lib/features/intro/presentation/bloc/intro_bloc.dart
  3. 82
      lib/features/intro/presentation/ui/intro_page.dart

58
lib/common_ui/resources/my_assets.dart

@ -3,9 +3,28 @@ class MyAssets {
const MyAssets._internal();
factory MyAssets() => _i;
/// PNG, JPG
static const String backgroundHome = 'assets/images/background_intro.png';
static const String closeBtn = 'assets/images/close_btn.svg';
static const String hadiHoda = 'assets/images/hadi_hoda.png';
static const String khadijeLogo = 'assets/images/khadije_logo.png';
static const String pattern = 'assets/images/pattern.png';
static const String persons = 'assets/images/persons.png';
static const String diamond = 'assets/images/diamond.png';
static const String mapBackground = 'assets/images/map_background.png';
static const String level = 'assets/images/level.png';
static const String finishedLevel = 'assets/images/finished_level.png';
static const String currentLevel = 'assets/images/current_level.png';
static const String homeButton = 'assets/images/home_button.png';
static const String error = 'assets/images/error.png';
static const String leaf = 'assets/images/leaf.png';
static const String happyPersons = 'assets/images/happy_persons.png';
static const String diamondBig = 'assets/images/diamond_big.png';
static const String ship = 'assets/images/ship.png';
static const String shiny = 'assets/images/shiny.png';
static const String loading = 'assets/images/loading.png';
/// SVG
static const String closeBtn = 'assets/images/close_btn.svg';
static const String musicOff = 'assets/images/music_off.svg';
static const String musicOn = 'assets/images/music_on.svg';
static const String button = 'assets/images/button.svg';
@ -18,32 +37,39 @@ class MyAssets {
static const String instagram = 'assets/images/instagram.svg';
static const String language = 'assets/images/language.svg';
static const String newHorizon = 'assets/images/new_horizon.svg';
static const String khadijeLogo = 'assets/images/khadije_logo.png';
static const String home = 'assets/images/home.svg';
static const String music = 'assets/images/music.svg';
static const String pattern = 'assets/images/pattern.png';
static const String persons = 'assets/images/persons.png';
static const String bubbleChatLeft = 'assets/images/bubble_chat_left.svg';
static const String bubbleChatRight = 'assets/images/bubble_chat_right.svg';
static const String diamond = 'assets/images/diamond.png';
static const String done = 'assets/images/done.svg';
static const String correct = 'assets/images/correct.svg';
static const String wrong = 'assets/images/wrong.svg';
static const String handPoint = 'assets/images/hand_point.svg';
static const String mapBackground = 'assets/images/map_background.png';
static const String level = 'assets/images/level.png';
static const String finishedLevel = 'assets/images/finished_level.png';
static const String currentLevel = 'assets/images/current_level.png';
static const String location = 'assets/images/location.svg';
static const String play = 'assets/images/play.svg';
static const String homeButton = 'assets/images/home_button.png';
static const String doneRounded = 'assets/images/done_rounded.svg';
static const String lang = 'assets/images/lang.svg';
static const String error = 'assets/images/error.png';
static const String leaf = 'assets/images/leaf.png';
static const String happyPersons = 'assets/images/happy_persons.png';
static const String diamondBig = 'assets/images/diamond_big.png';
static const String ship = 'assets/images/ship.png';
static const String shiny = 'assets/images/shiny.png';
static const String unMusic = 'assets/images/unmusic.svg';
static final List<String> images = [
backgroundHome,
hadiHoda,
khadijeLogo,
pattern,
persons,
diamond,
mapBackground,
level,
finishedLevel,
currentLevel,
homeButton,
error,
leaf,
happyPersons,
diamondBig,
ship,
shiny,
loading,
];
}

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

@ -1,64 +1,39 @@
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart';
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart';
import 'package:hadi_hoda_flutter/core/params/no_params.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/core/routers/my_routes.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/core/utils/local_storage.dart';
import 'package:hadi_hoda_flutter/features/download/domain/entities/download_entity.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/usecases/get_images_usecase.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/usecases/loading_stream_usecase.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_event.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_state.dart';
class IntroBloc extends Bloc<IntroEvent, IntroState> {
/// ------------constructor------------
IntroBloc(
this._getImagesUseCase,
this._loadingStreamUseCase,
)
: super(const IntroState()) {
on<GetImagesEvent>(_getImagesEvent);
loadingStream = _loadingStreamUseCase();
}
IntroBloc() : super(const IntroState());
/// ------------UseCases------------
final GetImagesUseCase _getImagesUseCase;
final LoadingStreamUseCase _loadingStreamUseCase;
/// ------------Variables------------
Stream<DownloadEntity> loadingStream = Stream.empty();
/// ------------Controllers------------
/// ------------Functions------------
Future<void> _precacheAllImages(BuildContext context) async {
await Future.wait(
MyAssets.images.map(
(assetPath) => precacheImage(AssetImage(assetPath), context),
),
);
}
/// ------------Api Calls------------
FutureOr<void> _getImagesEvent(
GetImagesEvent event,
Emitter<IntroState> emit,
) async {
emit(state.copyWith(getFilesStatus: BaseInit()));
await _getImagesUseCase(NoParams()).then((value) {
value.fold(
(data) async {
if(LocalStorage.readData(key: MyConstants.firstLanguagePage) != 'true'){
ContextProvider.context.goNamed(Routes.languagePage);
} else {
await Future.delayed(Duration(milliseconds: 500), () {
if (ContextProvider.context.mounted) {
ContextProvider.context.goNamed(Routes.homePage);
}
});
}
},
(error) async {
emit(state.copyWith(getFilesStatus: BaseError(error.errorMessage)));
},
);
});
Future<void> goToHomePage(BuildContext context) async {
if (context.mounted) {
await _precacheAllImages(context);
}
if (context.mounted) {
context.goNamed(Routes.homePage);
}
}
/// ------------Api Calls------------
}

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

@ -1,20 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_text_style.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/core/utils/convert_size.dart';
import 'package:hadi_hoda_flutter/core/utils/my_image.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/error/error_state.dart';
import 'package:hadi_hoda_flutter/features/download/domain/entities/download_entity.dart';
import 'package:hadi_hoda_flutter/core/widgets/animations/rotation_anim.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_event.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_state.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/intro_loading_widget.dart';
class IntroPage extends StatefulWidget {
const IntroPage({super.key});
@ -27,9 +18,12 @@ class _IntroPageState extends State<IntroPage> {
@override
void initState() {
super.initState();
context.read<IntroBloc>().add(GetImagesEvent());
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<IntroBloc>().goToHomePage(context);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
@ -55,31 +49,12 @@ class _IntroPageState extends State<IntroPage> {
),
),
),
child: BlocBuilder<IntroBloc, IntroState>(
buildWhen: (previous, current) =>
previous.getFilesStatus != current.getFilesStatus,
builder: (context, state) {
if (state.getFilesStatus is BaseError) {
return Padding(
padding: EdgeInsets.symmetric(
vertical: MediaQuery.viewPaddingOf(context).bottom + MySpaces.s16,
horizontal: 60,
),
child: ErrorState(
onTap: () => context.read<IntroBloc>().add(GetImagesEvent()),
),
);
} else {
return Stack(
alignment: Alignment.center,
children: [
_image(),
_text(context),
_loading(context),
],
);
}
}
child: Stack(
alignment: Alignment.center,
children: [
_image(),
_loading(context),
],
),
),
);
@ -92,39 +67,16 @@ class _IntroPageState extends State<IntroPage> {
);
}
Widget _text(BuildContext context) {
return PositionedDirectional(
bottom: 130,
child: Column(
spacing: MySpaces.s6,
children: [
Text(
context.translate.please_wait,
style: Marhey.medium22.copyWith(
color: MyColors.white,
),
),
StreamBuilder<DownloadEntity>(
initialData: DownloadEntity(),
stream: context.read<IntroBloc>().loadingStream,
builder: (context, snapshot) => Text(
'${context.translate.downloading_data} (${snapshot.data?.count.toMB ?? 0.0}mb / ${snapshot.data?.total.toMB ?? 0.0}mb)',
style: Marhey.medium12.copyWith(
color: MyColors.white,
),
),
),
],
),
);
}
Positioned _loading(BuildContext context) {
return Positioned(
bottom: MediaQuery.viewPaddingOf(context).bottom + MySpaces.s16,
child: IntroLoadingWidget(
loadingStream: context.read<IntroBloc>().loadingStream,
),
child: RotationAnim(
child: MyImage(
image: MyAssets.loading,
size: 70,
),
)
);
}
}
Loading…
Cancel
Save