import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_app_2/components/extensions/context_x.dart'; import 'package:flutter_app_2/components/utils/debounce.dart'; import 'package:flutter_app_2/data/repositories/communism_repository.dart'; import 'package:flutter_app_2/data/repositories/mock_repository.dart'; import 'package:flutter_app_2/presentation/common/svg_objects.dart'; import 'package:flutter_app_2/presentation/datails_page/datails_page.dart'; import 'package:flutter_app_2/presentation/home_page/bloc/bloc.dart'; import 'package:flutter_app_2/presentation/home_page/bloc/events.dart'; import 'package:flutter_app_2/presentation/home_page/bloc/state.dart'; import 'package:flutter_app_2/presentation/like_bloc/like_bloc.dart'; import 'package:flutter_app_2/presentation/like_bloc/like_event.dart'; import 'package:flutter_app_2/presentation/like_bloc/like_state.dart'; import 'package:flutter_app_2/presentation/locale_bloc/locale_bloc.dart'; import 'package:flutter_app_2/presentation/locale_bloc/locale_events.dart'; import 'package:flutter_app_2/presentation/locale_bloc/locale_state.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../domain/models/card.dart'; part 'card.dart'; class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { @override void initState() { SvgObjects.init(); WidgetsBinding.instance.addPostFrameCallback((_) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( 'Здравствуй, товарищ!', style: Theme.of(context).textTheme.bodyLarge, ), backgroundColor: Colors.deepOrange, duration: const Duration(seconds: 7), )); }); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: const MyWidget(), ); } } class MyWidget extends StatefulWidget { const MyWidget({super.key}); @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State { final communismRepository repo = communismRepository(); late Future?> data; final TextEditingController searchController = TextEditingController(); @override void initState() { WidgetsBinding.instance.addPostFrameCallback((_) { context.read().add(const HomeLoadDataEvent()); context.read().add(const LoadLikesEvent()); }); super.initState(); data = repo.loadData(); // Инициализация данных при загрузке } @override void dispose() { searchController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Padding( padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), child: Column( children: [ Row( children: [ Expanded( flex: 4, child: Padding( padding: const EdgeInsets.all(12), child: CupertinoSearchTextField( controller: searchController, placeholder: context.locale.search, onChanged: (search) { Debounce.run(() => context .read() .add(HomeLoadDataEvent(search: search))); }, ), ), ), GestureDetector( onTap: () => context.read().add(const ChangeLocaleEvent()), child: SizedBox.square( dimension: 50, child: Padding( padding: const EdgeInsets.only(right: 12), child: BlocBuilder( builder: (context, state) { return state.currentLocale.languageCode == 'ru' ? const SvgRu() : const SvgUk(); }, ), ), ), ), ], ), BlocBuilder( builder: (context, state) => state.isLoading ? const CircularProgressIndicator() : BlocBuilder( builder: (context, likeState) { return Expanded( child: RefreshIndicator( onRefresh: _onRefresh, child: ListView.builder( padding: EdgeInsets.zero, itemCount: state.data?.length ?? 0, itemBuilder: (context, index) { final data = state.data?[index]; return data != null ? _Card.fromData( data, onLike: _onLike, isLiked: likeState.likedIds ?.contains(data.id) == true, onTap: () => _navToDatails(context, data), ) : const SizedBox.shrink(); }, ), ), ); }, ), ), ], ), ); } Future _onRefresh() { context .read() .add(HomeLoadDataEvent(search: searchController.text)); return Future.value(null); } void _onLike(String? id, String title, bool isLiked) { if (id != null) { context.read().add(ChangeLikeEvent(id)); _showSnackBar(context, title, !isLiked); } } void _navToDatails(BuildContext context, CardData data) { Navigator.push( context, CupertinoPageRoute(builder: (context) => DetailsPage(data)), ); } void _showSnackBar(BuildContext context, String title, bool isLiked) { WidgetsBinding.instance.addPostFrameCallback((_) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( '$title ${isLiked ? context.locale.liked : context.locale.disliked}', style: Theme.of(context).textTheme.bodyLarge, ), backgroundColor: Colors.deepOrange, duration: const Duration(seconds: 1), )); }); } }