PMU_PIbd32_Kamcharova_K.A/lib/main.dart

212 lines
6.5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'bloc.dart';
import 'events.dart';
import 'state.dart';
import 'character_service.dart';
import 'character.dart';
import 'pages/character_detail_page.dart';
void main() {
runApp(
MultiBlocProvider(
providers: [
BlocProvider<HomeBloc>(
create: (_) => HomeBloc(CharacterService()),
),
BlocProvider<DebouncedSearchCubit>(
create: (_) => DebouncedSearchCubit(),
),
],
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: MyHomePage(title: 'Identity'),
);
}
}
class MyHomePage extends StatelessWidget {
final String title;
MyHomePage({required this.title});
@override
Widget build(BuildContext context) {
// Загружаем данные сразу после инициализации страницы
context.read<HomeBloc>().add(HomeLoadDataEvent());
return Scaffold(
appBar: AppBar(
title: Text(title),
actions: [
IconButton(
icon: Icon(Icons.search),
onPressed: () {
showSearch(
context: context,
delegate: CharacterSearchDelegate(),
);
},
),
],
),
body: BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
if (state.status == HomeStatus.loading) {
return Center(child: CircularProgressIndicator());
} else if (state.status == HomeStatus.error) {
return Center(child: Text('Ошибка: ${state.errorMessage}'));
} else if (state.status == HomeStatus.loaded) {
final characters = state.characters;
return ListView.builder(
itemCount: characters.length,
itemBuilder: (context, index) {
final character = characters[index];
return ListTile(
leading: SizedBox(
width: 40,
child: Image.network(character.imageUrl, width: 50, height: 50),
),
title: Text(character.name),
subtitle: Text(character.typeString),
onTap: () {
// Переход на страницу с деталями персонажа
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CharacterDetailPage(character: character),
),
);
},
);
},
);
} else {
return Center(child: Text('Нет данных.'));
}
},
),
);
}
}
class CharacterSearchDelegate extends SearchDelegate {
@override
Widget buildSuggestions(BuildContext context) {
// Показываем предложения на основе текущего запроса
return BlocProvider<HomeBloc>(
create: (context) => HomeBloc(CharacterService()),
child: BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
final suggestions = state.characters
.where((character) => character.name.toLowerCase().contains(query.toLowerCase()))
.toList();
return ListView.builder(
itemCount: suggestions.length,
itemBuilder: (context, index) {
final character = suggestions[index];
return ListTile(
title: Text(character.name),
subtitle: Text(character.typeString),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CharacterDetailPage(character: character),
),
);
},
);
},
);
},
),
);
}
@override
Widget buildResults(BuildContext context) {
// Отправляем запрос с задержкой
final debouncedSearchCubit = context.read<DebouncedSearchCubit>();
debouncedSearchCubit.search(query);
return BlocBuilder<DebouncedSearchCubit, String>(
builder: (context, searchQuery) {
// Отправляем запрос на сервер через HomeBloc
if (searchQuery.isNotEmpty) {
context.read<HomeBloc>().add(HomeLoadDataEvent(searchQuery: searchQuery));
}
return BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
if (state.status == HomeStatus.loading) {
return Center(child: CircularProgressIndicator());
} else if (state.status == HomeStatus.error) {
return Center(child: Text('Ошибка: ${state.errorMessage}'));
} else if (state.status == HomeStatus.loaded) {
final characters = state.characters
.where((character) => character.name.toLowerCase().contains(searchQuery.toLowerCase()))
.toList();
return ListView.builder(
itemCount: characters.length,
itemBuilder: (context, index) {
final character = characters[index];
return ListTile(
title: Text(character.name),
subtitle: Text(character.typeString),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CharacterDetailPage(character: character),
),
);
},
);
},
);
} else {
return Center(child: Text('Нет результатов'));
}
},
);
},
);
}
@override
List<Widget> buildActions(BuildContext context) {
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () {
query = ''; // Очистить запрос
showSuggestions(context); // Показать предложения
},
),
];
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
close(context, null); // Закрыть поиск
},
);
}
}