chore: Format code

This commit is contained in:
2026-05-10 23:14:57 +02:00
parent dd6d4a204d
commit 2c279a0150
14 changed files with 282 additions and 241 deletions

View File

@@ -2085,7 +2085,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',
homepage: 'https://github.com/fluttercommunity/get_it', homepage: 'https://github.com/fluttercommunity/get_it',
authors: [ authors: [
'Flutter Community <community@flutter.zone>', 'Flutter Community <community@flutter.zone>',
'Thomas Burkhart <burkhartsengineering@gmail.com>' 'Thomas Burkhart <burkhartsengineering@gmail.com>',
], ],
version: '7.2.0', version: '7.2.0',
license: '''MIT License license: '''MIT License

View File

@@ -38,8 +38,8 @@ void main() async {
// Load animes // Load animes
GetIt.I.get<AnimeListBloc>().add( GetIt.I.get<AnimeListBloc>().add(
AnimesLoadedEvent(), AnimesLoadedEvent(),
); );
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await LocaleSettings.useDeviceLocale(); await LocaleSettings.useDeviceLocale();

View File

@@ -123,7 +123,10 @@ class DatabaseService {
); );
} }
Future<AnimeTrackingData> incrementAnimeWatchCounter(AnimeTrackingData data, int value) async { Future<AnimeTrackingData> incrementAnimeWatchCounter(
AnimeTrackingData data,
int value,
) async {
final result = await _db.rawQuery( final result = await _db.rawQuery(
'UPDATE $animeTable SET episodesWatched = episodesWatched + $value WHERE id = ? RETURNING *', 'UPDATE $animeTable SET episodesWatched = episodesWatched + $value WHERE id = ? RETURNING *',
[ [
@@ -171,7 +174,10 @@ class DatabaseService {
); );
} }
Future<MangaTrackingData> incrementMangaReadChapters(MangaTrackingData data, int value) async { Future<MangaTrackingData> incrementMangaReadChapters(
MangaTrackingData data,
int value,
) async {
final result = await _db.rawQuery( final result = await _db.rawQuery(
'UPDATE $mangaTable SET episodesWatched = chaptersRead + $value WHERE id = ? RETURNING *', 'UPDATE $mangaTable SET episodesWatched = chaptersRead + $value WHERE id = ? RETURNING *',
[ [

View File

@@ -31,10 +31,12 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
} }
/// Internal anime state /// Internal anime state
final List<AnimeTrackingData> _animes = final List<AnimeTrackingData> _animes = List<AnimeTrackingData>.empty(
List<AnimeTrackingData>.empty(growable: true); growable: true,
final List<MangaTrackingData> _mangas = );
List<MangaTrackingData>.empty(growable: true); final List<MangaTrackingData> _mangas = List<MangaTrackingData>.empty(
growable: true,
);
List<AnimeTrackingData> get unfilteredAnime => _animes; List<AnimeTrackingData> get unfilteredAnime => _animes;
@@ -69,7 +71,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
if (event.checkIfExists) { if (event.checkIfExists) {
final shouldAdd = final shouldAdd =
_animes.firstWhereOrNull((element) => element.id == event.data.id) == _animes.firstWhereOrNull((element) => element.id == event.data.id) ==
null; null;
if (shouldAdd) { if (shouldAdd) {
_animes.add(event.data); _animes.add(event.data);
} }
@@ -96,7 +98,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
if (event.checkIfExists) { if (event.checkIfExists) {
final shouldAdd = final shouldAdd =
_mangas.firstWhereOrNull((element) => element.id == event.data.id) == _mangas.firstWhereOrNull((element) => element.id == event.data.id) ==
null; null;
if (shouldAdd) { if (shouldAdd) {
_mangas.add(event.data); _mangas.add(event.data);
} }
@@ -120,9 +122,12 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
final anime = state.animes[index]; final anime = state.animes[index];
if (anime.episodesTotal != null && if (anime.episodesTotal != null &&
anime.episodesWatched + 1 > anime.episodesTotal!) return; anime.episodesWatched + 1 > anime.episodesTotal!)
return;
final newAnime = await GetIt.I.get<DatabaseService>().incrementAnimeWatchCounter(anime, 1); final newAnime = await GetIt.I
.get<DatabaseService>()
.incrementAnimeWatchCounter(anime, 1);
final newList = List<AnimeTrackingData>.from(state.animes); final newList = List<AnimeTrackingData>.from(state.animes);
newList[index] = newAnime; newList[index] = newAnime;
emit( emit(
@@ -142,8 +147,9 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
final anime = state.animes[index]; final anime = state.animes[index];
if (anime.episodesWatched - 1 < 0) return; if (anime.episodesWatched - 1 < 0) return;
final newAnime = await GetIt.I
final newAnime = await GetIt.I.get<DatabaseService>().incrementAnimeWatchCounter(anime, -1); .get<DatabaseService>()
.incrementAnimeWatchCounter(anime, -1);
final newList = List<AnimeTrackingData>.from(state.animes); final newList = List<AnimeTrackingData>.from(state.animes);
newList[index] = newAnime; newList[index] = newAnime;
emit( emit(
@@ -217,9 +223,12 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
final manga = state.mangas[index]; final manga = state.mangas[index];
if (manga.chaptersTotal != null && if (manga.chaptersTotal != null &&
manga.chaptersRead + 1 > manga.chaptersTotal!) return; manga.chaptersRead + 1 > manga.chaptersTotal!)
return;
final newManga = await GetIt.I.get<DatabaseService>().incrementMangaReadChapters(manga, 1); final newManga = await GetIt.I
.get<DatabaseService>()
.incrementMangaReadChapters(manga, 1);
final newList = List<MangaTrackingData>.from(state.mangas); final newList = List<MangaTrackingData>.from(state.mangas);
newList[index] = newManga; newList[index] = newManga;
emit( emit(
@@ -244,7 +253,9 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
final manga = state.mangas[index]; final manga = state.mangas[index];
if (manga.chaptersRead - 1 < 0) return; if (manga.chaptersRead - 1 < 0) return;
final newManga = await GetIt.I.get<DatabaseService>().incrementMangaReadChapters(manga, -1); final newManga = await GetIt.I
.get<DatabaseService>()
.incrementMangaReadChapters(manga, -1);
final newList = List<MangaTrackingData>.from(state.mangas); final newList = List<MangaTrackingData>.from(state.mangas);
newList[index] = newManga; newList[index] = newManga;
emit( emit(

View File

@@ -36,10 +36,10 @@ class AnimeSearchBloc extends Bloc<AnimeSearchEvent, AnimeSearchState> {
); );
GetIt.I.get<NavigationBloc>().add( GetIt.I.get<NavigationBloc>().add(
PushedNamedEvent( PushedNamedEvent(
const NavigationDestination(animeSearchRoute), const NavigationDestination(animeSearchRoute),
), ),
); );
} }
Future<void> _onQueryChanged( Future<void> _onQueryChanged(
@@ -122,34 +122,34 @@ class AnimeSearchBloc extends Bloc<AnimeSearchEvent, AnimeSearchState> {
Emitter<AnimeSearchState> emit, Emitter<AnimeSearchState> emit,
) async { ) async {
GetIt.I.get<list.AnimeListBloc>().add( GetIt.I.get<list.AnimeListBloc>().add(
state.trackingType == TrackingMediumType.anime state.trackingType == TrackingMediumType.anime
? list.AnimeAddedEvent( ? list.AnimeAddedEvent(
AnimeTrackingData( AnimeTrackingData(
event.result.id, event.result.id,
MediumTrackingState.ongoing, MediumTrackingState.ongoing,
event.result.title, event.result.title,
0, 0,
event.result.total, event.result.total,
event.result.thumbnailUrl, event.result.thumbnailUrl,
event.result.isAiring, event.result.isAiring,
event.result.broadcastDay, event.result.broadcastDay,
), ),
) )
: list.MangaAddedEvent( : list.MangaAddedEvent(
MangaTrackingData( MangaTrackingData(
event.result.id, event.result.id,
MediumTrackingState.ongoing, MediumTrackingState.ongoing,
event.result.title, event.result.title,
0, 0,
0, 0,
event.result.total, event.result.total,
event.result.thumbnailUrl, event.result.thumbnailUrl,
), ),
), ),
); );
GetIt.I.get<NavigationBloc>().add( GetIt.I.get<NavigationBloc>().add(
PoppedRouteEvent(), PoppedRouteEvent(),
); );
} }
} }

View File

@@ -34,10 +34,10 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
); );
GetIt.I.get<NavigationBloc>().add( GetIt.I.get<NavigationBloc>().add(
PushedNamedEvent( PushedNamedEvent(
const NavigationDestination(detailsRoute), const NavigationDestination(detailsRoute),
), ),
); );
} }
Future<void> _onMangaRequested( Future<void> _onMangaRequested(
@@ -52,10 +52,10 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
); );
GetIt.I.get<NavigationBloc>().add( GetIt.I.get<NavigationBloc>().add(
PushedNamedEvent( PushedNamedEvent(
const NavigationDestination(detailsRoute), const NavigationDestination(detailsRoute),
), ),
); );
} }
Future<void> _onDetailsUpdated( Future<void> _onDetailsUpdated(
@@ -69,13 +69,13 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
), ),
); );
await GetIt.I await GetIt.I.get<DatabaseService>().updateAnime(
.get<DatabaseService>() event.data as AnimeTrackingData,
.updateAnime(event.data as AnimeTrackingData); );
GetIt.I.get<AnimeListBloc>().add( GetIt.I.get<AnimeListBloc>().add(
AnimeUpdatedEvent(event.data as AnimeTrackingData), AnimeUpdatedEvent(event.data as AnimeTrackingData),
); );
} else { } else {
emit( emit(
state.copyWith( state.copyWith(
@@ -83,13 +83,13 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
), ),
); );
await GetIt.I await GetIt.I.get<DatabaseService>().updateManga(
.get<DatabaseService>() event.data as MangaTrackingData,
.updateManga(event.data as MangaTrackingData); );
GetIt.I.get<AnimeListBloc>().add( GetIt.I.get<AnimeListBloc>().add(
MangaUpdatedEvent(event.data as MangaTrackingData), MangaUpdatedEvent(event.data as MangaTrackingData),
); );
} }
} }

View File

@@ -105,8 +105,9 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
); );
final title = anime.getElement('series_title')!.text; final title = anime.getElement('series_title')!.text;
final totalEpisodes = final totalEpisodes = int.parse(
int.parse(anime.getElement('series_episodes')!.text); anime.getElement('series_episodes')!.text,
);
final id = anime.getElement('series_animedb_id')!.text; final id = anime.getElement('series_animedb_id')!.text;
print('Waiting 500ms to not hammer Jikan ($title)'); print('Waiting 500ms to not hammer Jikan ($title)');
@@ -117,21 +118,21 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
// Add the anime // Add the anime
await GetIt.I.get<DatabaseService>().addAnime( await GetIt.I.get<DatabaseService>().addAnime(
AnimeTrackingData( AnimeTrackingData(
id, id,
malStatusToTrackingState( malStatusToTrackingState(
anime.getElement('my_status')!.text, anime.getElement('my_status')!.text,
), ),
title, title,
int.parse(anime.getElement('my_watched_episodes')!.text), int.parse(anime.getElement('my_watched_episodes')!.text),
// 0 means that MAL does not know // 0 means that MAL does not know
totalEpisodes == 0 ? null : totalEpisodes, totalEpisodes == 0 ? null : totalEpisodes,
data.imageUrl, data.imageUrl,
// NOTE: When the calendar gets refreshed, this should also get cleared // NOTE: When the calendar gets refreshed, this should also get cleared
true, true,
null, null,
), ),
); );
} }
// Hide the spinner again // Hide the spinner again
@@ -195,19 +196,19 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
// Add the manga // Add the manga
await GetIt.I.get<DatabaseService>().addManga( await GetIt.I.get<DatabaseService>().addManga(
MangaTrackingData( MangaTrackingData(
id, id,
malStatusToTrackingState( malStatusToTrackingState(
manga.getElement('my_status')!.text, manga.getElement('my_status')!.text,
), ),
title, title,
int.parse(manga.getElement('my_read_chapters')!.text), int.parse(manga.getElement('my_read_chapters')!.text),
0, 0,
// 0 means that MAL does not know // 0 means that MAL does not know
totalChapters == 0 ? null : totalChapters, totalChapters == 0 ? null : totalChapters,
data.imageUrl, data.imageUrl,
), ),
); );
} }
// Hide the spinner again // Hide the spinner again

View File

@@ -11,11 +11,11 @@ class AboutPage extends StatelessWidget {
}); });
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>( static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
builder: (_) => const AboutPage(), builder: (_) => const AboutPage(),
settings: const RouteSettings( settings: const RouteSettings(
name: aboutRoute, name: aboutRoute,
), ),
); );
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@@ -18,11 +18,11 @@ class AnimeListPage extends StatefulWidget {
}); });
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>( static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
builder: (_) => const AnimeListPage(), builder: (_) => const AnimeListPage(),
settings: const RouteSettings( settings: const RouteSettings(
name: animeListRoute, name: animeListRoute,
), ),
); );
@override @override
AnimeListPageState createState() => AnimeListPageState(); AnimeListPageState createState() => AnimeListPageState();
@@ -107,8 +107,8 @@ class AnimeListPageState extends State<AnimeListPage> {
initialValue: state.animeFilterState, initialValue: state.animeFilterState,
onSelected: (filterState) { onSelected: (filterState) {
context.read<AnimeListBloc>().add( context.read<AnimeListBloc>().add(
AnimeFilterChangedEvent(filterState), AnimeFilterChangedEvent(filterState),
); );
}, },
itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.anime), itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.anime),
); );
@@ -120,8 +120,8 @@ class AnimeListPageState extends State<AnimeListPage> {
initialValue: state.mangaFilterState, initialValue: state.mangaFilterState,
onSelected: (filterState) { onSelected: (filterState) {
context.read<AnimeListBloc>().add( context.read<AnimeListBloc>().add(
MangaFilterChangedEvent(filterState), MangaFilterChangedEvent(filterState),
); );
}, },
itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.manga), itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.manga),
); );
@@ -164,25 +164,25 @@ class AnimeListPageState extends State<AnimeListPage> {
return GridItem( return GridItem(
minusCallback: () { minusCallback: () {
context.read<AnimeListBloc>().add( context.read<AnimeListBloc>().add(
AnimeEpisodeDecrementedEvent( AnimeEpisodeDecrementedEvent(
anime.id, anime.id,
), ),
); );
}, },
plusCallback: () { plusCallback: () {
context.read<AnimeListBloc>().add( context.read<AnimeListBloc>().add(
AnimeEpisodeIncrementedEvent( AnimeEpisodeIncrementedEvent(
anime.id, anime.id,
), ),
); );
}, },
child: AnimeCoverImage( child: AnimeCoverImage(
url: anime.thumbnailUrl, url: anime.thumbnailUrl,
hero: anime.id, hero: anime.id,
onTap: () { onTap: () {
context.read<DetailsBloc>().add( context.read<DetailsBloc>().add(
AnimeDetailsRequestedEvent(anime), AnimeDetailsRequestedEvent(anime),
); );
}, },
extra: Align( extra: Align(
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
@@ -214,25 +214,25 @@ class AnimeListPageState extends State<AnimeListPage> {
return GridItem( return GridItem(
minusCallback: () { minusCallback: () {
context.read<AnimeListBloc>().add( context.read<AnimeListBloc>().add(
MangaChapterDecrementedEvent( MangaChapterDecrementedEvent(
manga.id, manga.id,
), ),
); );
}, },
plusCallback: () { plusCallback: () {
context.read<AnimeListBloc>().add( context.read<AnimeListBloc>().add(
MangaChapterIncrementedEvent( MangaChapterIncrementedEvent(
manga.id, manga.id,
), ),
); );
}, },
child: AnimeCoverImage( child: AnimeCoverImage(
hero: manga.id, hero: manga.id,
url: manga.thumbnailUrl, url: manga.thumbnailUrl,
onTap: () { onTap: () {
context.read<DetailsBloc>().add( context.read<DetailsBloc>().add(
MangaDetailsRequestedEvent(manga), MangaDetailsRequestedEvent(manga),
); );
}, },
extra: Align( extra: Align(
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
@@ -263,8 +263,8 @@ class AnimeListPageState extends State<AnimeListPage> {
child: FloatingActionButton( child: FloatingActionButton(
onPressed: () { onPressed: () {
context.read<AnimeSearchBloc>().add( context.read<AnimeSearchBloc>().add(
AnimeSearchRequestedEvent(state.trackingType), AnimeSearchRequestedEvent(state.trackingType),
); );
}, },
tooltip: t.tooltips.addNewItem, tooltip: t.tooltips.addNewItem,
child: const Icon(Icons.add), child: const Icon(Icons.add),
@@ -273,16 +273,17 @@ class AnimeListPageState extends State<AnimeListPage> {
}, },
), ),
bottomNavigationBar: BottomBar( bottomNavigationBar: BottomBar(
selectedIndex: selectedIndex: state.trackingType == TrackingMediumType.anime
state.trackingType == TrackingMediumType.anime ? 0 : 1, ? 0
: 1,
onTap: (int index) { onTap: (int index) {
context.read<AnimeListBloc>().add( context.read<AnimeListBloc>().add(
AnimeTrackingTypeChanged( AnimeTrackingTypeChanged(
index == 0 index == 0
? TrackingMediumType.anime ? TrackingMediumType.anime
: TrackingMediumType.manga, : TrackingMediumType.manga,
), ),
); );
_controller.jumpToPage(index); _controller.jumpToPage(index);
}, },

View File

@@ -12,11 +12,11 @@ class AnimeSearchPage extends StatelessWidget {
}); });
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>( static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
builder: (_) => const AnimeSearchPage(), builder: (_) => const AnimeSearchPage(),
settings: const RouteSettings( settings: const RouteSettings(
name: animeSearchRoute, name: animeSearchRoute,
), ),
); );
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -41,13 +41,13 @@ class AnimeSearchPage extends StatelessWidget {
), ),
onSubmitted: (_) { onSubmitted: (_) {
context.read<AnimeSearchBloc>().add( context.read<AnimeSearchBloc>().add(
SearchQuerySubmittedEvent(), SearchQuerySubmittedEvent(),
); );
}, },
onChanged: (value) { onChanged: (value) {
context.read<AnimeSearchBloc>().add( context.read<AnimeSearchBloc>().add(
SearchQueryChangedEvent(value), SearchQueryChangedEvent(value),
); );
}, },
), ),
), ),
@@ -66,8 +66,8 @@ class AnimeSearchPage extends StatelessWidget {
return InkWell( return InkWell(
onTap: () { onTap: () {
context.read<AnimeSearchBloc>().add( context.read<AnimeSearchBloc>().add(
ResultTappedEvent(item), ResultTappedEvent(item),
); );
}, },
child: ListItem( child: ListItem(
title: item.title, title: item.title,

View File

@@ -57,11 +57,11 @@ class CalendarPage extends StatefulWidget {
const CalendarPage({super.key}); const CalendarPage({super.key});
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>( static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
builder: (_) => const CalendarPage(), builder: (_) => const CalendarPage(),
settings: const RouteSettings( settings: const RouteSettings(
name: calendarRoute, name: calendarRoute,
), ),
); );
@override @override
CalendarPageState createState() => CalendarPageState(); CalendarPageState createState() => CalendarPageState();
@@ -109,11 +109,11 @@ class CalendarPageState extends State<CalendarPage> {
hero: 'calendar_${anime.id}', hero: 'calendar_${anime.id}',
onTap: () { onTap: () {
context.read<DetailsBloc>().add( context.read<DetailsBloc>().add(
AnimeDetailsRequestedEvent( AnimeDetailsRequestedEvent(
anime, anime,
heroImagePrefix: 'calendar_', heroImagePrefix: 'calendar_',
), ),
); );
}, },
), ),
); );
@@ -183,9 +183,9 @@ class CalendarPageState extends State<CalendarPage> {
actions: [ actions: [
IconButton( IconButton(
onPressed: () { onPressed: () {
context context.read<CalendarBloc>().add(
.read<CalendarBloc>() RefreshPerformedEvent(),
.add(RefreshPerformedEvent()); );
}, },
icon: const Icon(Icons.refresh), icon: const Icon(Icons.refresh),
), ),

View File

@@ -157,7 +157,10 @@ class DetailsPage extends StatelessWidget {
end: 8, end: 8,
), ),
child: Text( child: Text(
t.details.details.titleJa, t
.details
.details
.titleJa,
style: style:
Theme.of( Theme.of(
context, context,
@@ -173,21 +176,32 @@ class DetailsPage extends StatelessWidget {
end: 8, end: 8,
), ),
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize:
MainAxisSize
.min,
children: [ children: [
IconButton( IconButton(
onPressed: () async { onPressed: () async {
await Clipboard.setData( await Clipboard.setData(
ClipboardData( ClipboardData(
text: state.data!.title, text: state
), .data!
); .title,
}, ),
icon: const Icon(Icons.copy), );
},
icon:
const Icon(
Icons
.copy,
),
), ),
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsetsGeometry.only(left: 8), padding:
const EdgeInsetsGeometry.only(
left: 8,
),
child: Text( child: Text(
state state
.data! .data!
@@ -223,13 +237,17 @@ class DetailsPage extends StatelessWidget {
children: [ children: [
ElevatedButton( ElevatedButton(
onPressed: () async { onPressed: () async {
final url = switch (state.trackingType) { final url = switch (state
TrackingMediumType.anime => 'https://myanimelist.net/anime/${state.data!.id}', .trackingType) {
TrackingMediumType.manga => 'https://myanimelist.net/manga/${state.data!.id}', TrackingMediumType.anime =>
'https://myanimelist.net/anime/${state.data!.id}',
TrackingMediumType.manga =>
'https://myanimelist.net/manga/${state.data!.id}',
}; };
await launchUrl( await launchUrl(
Uri.parse(url), Uri.parse(url),
mode: LaunchMode.externalApplication, mode: LaunchMode
.externalApplication,
); );
}, },
child: Text(t.details.mal), child: Text(t.details.mal),

View File

@@ -11,11 +11,11 @@ class SettingsPage extends StatelessWidget {
const SettingsPage({super.key}); const SettingsPage({super.key});
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>( static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
builder: (_) => const SettingsPage(), builder: (_) => const SettingsPage(),
settings: const RouteSettings( settings: const RouteSettings(
name: settingsRoute, name: settingsRoute,
), ),
); );
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -58,11 +58,11 @@ class SettingsPage extends StatelessWidget {
} }
GetIt.I.get<SettingsBloc>().add( GetIt.I.get<SettingsBloc>().add(
AnimeListImportedEvent( AnimeListImportedEvent(
result.files.first.path!, result.files.first.path!,
ImportListType.mal, ImportListType.mal,
), ),
); );
}, },
), ),
ListTile( ListTile(
@@ -85,30 +85,31 @@ class SettingsPage extends StatelessWidget {
} }
GetIt.I.get<SettingsBloc>().add( GetIt.I.get<SettingsBloc>().add(
MangaListImportedEvent( MangaListImportedEvent(
result.files.first.path!, result.files.first.path!,
ImportListType.mal, ImportListType.mal,
), ),
); );
}, },
), ),
ListTile( ListTile(
title: Text(t.settings.exportData), title: Text(t.settings.exportData),
onTap: () async { onTap: () async {
// Pick the file // Pick the file
final result = final result = await FilePicker.platform
await FilePicker.platform.getDirectoryPath(); .getDirectoryPath();
if (result == null) return; if (result == null) return;
if (!(await Permission.manageExternalStorage if (!(await Permission.manageExternalStorage
.request()) .request())
.isGranted) return; .isGranted)
return;
GetIt.I.get<SettingsBloc>().add( GetIt.I.get<SettingsBloc>().add(
DataExportedEvent( DataExportedEvent(
result, result,
), ),
); );
}, },
), ),
ListTile( ListTile(
@@ -123,18 +124,19 @@ class SettingsPage extends StatelessWidget {
context: context, context: context,
builder: (_) => AlertDialog( builder: (_) => AlertDialog(
title: Text(t.settings.importInvalidData.title), title: Text(t.settings.importInvalidData.title),
content: content: Text(
Text(t.settings.importInvalidData.content), t.settings.importInvalidData.content,
),
), ),
); );
return; return;
} }
GetIt.I.get<SettingsBloc>().add( GetIt.I.get<SettingsBloc>().add(
DataImportedEvent( DataImportedEvent(
result.files.first.path!, result.files.first.path!,
), ),
); );
}, },
), ),
], ],

View File

@@ -39,8 +39,9 @@ class DropdownSelectorState<T> extends State<DropdownSelector<T>> {
void initState() { void initState() {
super.initState(); super.initState();
index = index = widget.values.indexWhere(
widget.values.indexWhere((item) => item.value == widget.initialValue); (item) => item.value == widget.initialValue,
);
} }
@override @override
@@ -53,48 +54,49 @@ class DropdownSelectorState<T> extends State<DropdownSelector<T>> {
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
final result = await showModalBottomSheet<T>( final result = await showModalBottomSheet<T>(
context: context, context: context,
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
builder: (context) => DraggableScrollableSheet( builder: (context) => DraggableScrollableSheet(
initialChildSize: 1, initialChildSize: 1,
builder: (context, controller) => ListView.builder( builder: (context, controller) => ListView.builder(
shrinkWrap: true, shrinkWrap: true,
controller: controller, controller: controller,
itemCount: widget.values.length, itemCount: widget.values.length,
itemBuilder: (context, index) => InkWell( itemBuilder: (context, index) => InkWell(
onTap: () { onTap: () {
Navigator.of(context).pop(widget.values[index].value); Navigator.of(context).pop(widget.values[index].value);
}, },
child: Padding( child: Padding(
padding: const EdgeInsetsGeometry.symmetric( padding: const EdgeInsetsGeometry.symmetric(
horizontal: 16, horizontal: 16,
vertical: 12, vertical: 12,
), ),
child: Row( child: Row(
children: [ children: [
Text( Text(
widget.values[index].text, widget.values[index].text,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
),
if (this.index == index)
const Padding(
padding: EdgeInsets.only(left: 12),
child: Icon(Icons.check),
), ),
if (this.index == index) ],
const Padding(
padding: EdgeInsets.only(left: 12),
child: Icon(Icons.check),
),
],
),
), ),
), ),
), ),
), ),
),
); );
if (result == null) return; if (result == null) return;
if (result == widget.values[index].value) return; if (result == widget.values[index].value) return;
setState(() { setState(() {
index = index = widget.values.indexWhere(
widget.values.indexWhere((item) => item.value == result); (item) => item.value == result,
);
}); });
widget.onChanged(result); widget.onChanged(result);