fix: resolve flutter analyze errors - remove leaked code, fix method calls, cleanup imports

This commit is contained in:
2026-03-23 16:55:54 +07:00
parent 4f202936fa
commit 71f1feaf98
33 changed files with 2851 additions and 224 deletions
@@ -1,18 +1,87 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import '../../../shared/widgets/feature_placeholder.dart';
import '../../../app/router/route_names.dart';
import '../../../core/models/novel_model.dart';
import '../providers/genres_provider.dart';
class GenresScreen extends StatelessWidget {
class GenresScreen extends ConsumerWidget {
const GenresScreen({super.key});
@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
final genresAsync = ref.watch(genresProvider);
return Scaffold(
appBar: AppBar(title: const Text('The loai')),
body: const FeaturePlaceholder(
title: 'Genre Discovery',
description:
'Khung danh sach the loai va man hinh truyện theo the loai slug de dong bo hanh vi voi web.',
appBar: AppBar(title: const Text('Th loi')),
body: genresAsync.when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (e, _) => Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.error_outline, size: 48),
const SizedBox(height: 8),
Text('Lỗi tải thể loại'),
TextButton(
onPressed: () => ref.invalidate(genresProvider),
child: const Text('Thử lại'),
),
],
),
),
data: (genres) => GridView.builder(
padding: const EdgeInsets.all(12),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
childAspectRatio: 2.5,
),
itemCount: genres.length,
itemBuilder: (context, index) {
final genre = genres[index];
return _GenreCard(genre: genre);
},
),
),
);
}
}
class _GenreCard extends StatelessWidget {
final GenreModel genre;
const _GenreCard({required this.genre});
@override
Widget build(BuildContext context) {
return Card(
child: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () => context.go('${RouteNames.search}?genre=${genre.slug}'),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
genre.name,
style: Theme.of(context).textTheme.titleSmall,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
if (genre.novelCount > 0)
Text(
'${genre.novelCount} truyện',
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
],
),
),
),
);
}
@@ -0,0 +1,11 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../core/models/novel_model.dart';
import '../../../core/network/providers.dart';
final genresProvider = FutureProvider<List<GenreModel>>((ref) async {
final client = ref.read(apiClientProvider);
final res = await client.dio.get('/api/genres');
return (res.data as List)
.map((e) => GenreModel.fromJson(e as Map<String, dynamic>))
.toList();
});