mirror of
https://github.com/ArizArmeidi/AnimSearch.git
synced 2025-05-17 22:16:06 +08:00
7
lib/constants.dart
Normal file
7
lib/constants.dart
Normal file
@ -0,0 +1,7 @@
|
||||
const api_url = 'https://api.jikan.moe/v4/anime';
|
||||
const top_url = 'https://api.jikan.moe/v4/anime?status=airing';
|
||||
const upcoming_url = 'https://api.jikan.moe/v4/anime?status=upcoming';
|
||||
const series_url = 'https://api.jikan.moe/v4/anime?status=airing&type=tv';
|
||||
const movie_url = 'https://api.jikan.moe/v4/anime?status=airing&type=movie';
|
||||
const ova_url = 'https://api.jikan.moe/v4/anime?status=airing&type=ova';
|
||||
const special_url = 'https://api.jikan.moe/v4/anime?status=airing&type=special';
|
@ -21,8 +21,8 @@ class MyApp extends StatelessWidget {
|
||||
appBarTheme: AppBarTheme(
|
||||
elevation: 0,
|
||||
),
|
||||
primaryColor: Colors.white,
|
||||
accentColor: Colors.orange,
|
||||
primaryColor: Colors.white,
|
||||
colorScheme: ColorScheme.fromSwatch().copyWith(secondary: Colors.orange),
|
||||
),
|
||||
home: HomeScreen(),
|
||||
routes: {
|
||||
|
@ -47,9 +47,9 @@ class AnimeModel {
|
||||
return AnimeModel(
|
||||
malId: json['mal_id'] ?? 0,
|
||||
url: json['url'] ?? '',
|
||||
imageUrl: json['image_url'] ?? '',
|
||||
imageUrl: json['images']['jpg']['image_url'] ?? '',
|
||||
title: json['title'] ?? '',
|
||||
trailerUrl: json['trailer_url'] ?? '',
|
||||
trailerUrl: json['trailer']['url'] ?? '',
|
||||
titleEnglish: json['title_english'] ?? 'TBA',
|
||||
synopsis: json['synopsis'] ?? '',
|
||||
status: json['status'] ?? '',
|
||||
|
@ -15,7 +15,7 @@ class HomeCardModel {
|
||||
return HomeCardModel(
|
||||
malId: json['mal_id'],
|
||||
url: json['url'],
|
||||
imageUrl: json['image_url'],
|
||||
imageUrl: json['images']['jpg']['image_url'],
|
||||
title: json['title'],
|
||||
);
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
import 'package:anim_search/constants.dart';
|
||||
import 'package:anim_search/models/anime_model.dart';
|
||||
import 'package:anim_search/models/home_card_model.dart';
|
||||
import 'package:anim_search/models/recommendation_model.dart';
|
||||
import 'package:anim_search/types/category_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
@ -13,15 +15,37 @@ class DataProvider with ChangeNotifier {
|
||||
late int genreId;
|
||||
late AnimeModel animeData = AnimeModel();
|
||||
|
||||
Future<void> getHomeData({String category = 'airing'}) async {
|
||||
final String url = 'https://api.jikan.moe/v3/top/anime/1/$category';
|
||||
Future<void> getHomeData({CategoryType category = CategoryType.top}) async {
|
||||
final String url;
|
||||
|
||||
switch (category) {
|
||||
case CategoryType.top:
|
||||
url = top_url;
|
||||
break;
|
||||
case CategoryType.upcoming:
|
||||
url = upcoming_url;
|
||||
break;
|
||||
case CategoryType.series:
|
||||
url = series_url;
|
||||
break;
|
||||
case CategoryType.movie:
|
||||
url = movie_url;
|
||||
break;
|
||||
case CategoryType.ova:
|
||||
url = ova_url;
|
||||
break;
|
||||
case CategoryType.special:
|
||||
url = special_url;
|
||||
break;
|
||||
}
|
||||
|
||||
try {
|
||||
isLoading = true;
|
||||
isError = false;
|
||||
var dio = Dio();
|
||||
var response = await dio.get(url);
|
||||
List<HomeCardModel> tempData = [];
|
||||
List items = response.data['top'];
|
||||
List items = response.data['data'];
|
||||
tempData = items.map((data) => HomeCardModel.fromJson(data)).toList();
|
||||
searchList = tempData;
|
||||
print(searchList.length);
|
||||
@ -59,15 +83,14 @@ class DataProvider with ChangeNotifier {
|
||||
}
|
||||
|
||||
Future<void> searchData(String query) async {
|
||||
final String url =
|
||||
'https://api.jikan.moe/v3/search/anime?q=$query&page=1&limit=12';
|
||||
final String url = Uri.encodeFull(api_url + '?q=$query&page=1&limit=12');
|
||||
try {
|
||||
isLoading = true;
|
||||
isError = false;
|
||||
var dio = Dio();
|
||||
var response = await dio.get(url);
|
||||
List<HomeCardModel> tempData = [];
|
||||
List items = response.data['results'];
|
||||
List items = response.data['data'];
|
||||
tempData = items.map((data) => HomeCardModel.fromJson(data)).toList();
|
||||
searchList = tempData;
|
||||
isLoading = false;
|
||||
@ -104,13 +127,13 @@ class DataProvider with ChangeNotifier {
|
||||
}
|
||||
|
||||
Future<void> getAnimeData(int malId) async {
|
||||
final String url = 'https://api.jikan.moe/v3/anime/$malId';
|
||||
final String url = 'https://api.jikan.moe/v4/anime/$malId';
|
||||
try {
|
||||
isLoading = true;
|
||||
isError = false;
|
||||
var dio = Dio();
|
||||
var response = await dio.get(url);
|
||||
animeData = AnimeModel.fromJson(response.data);
|
||||
animeData = AnimeModel.fromJson(response.data['data']);
|
||||
await getRecommendationData(animeData.genreId);
|
||||
isLoading = false;
|
||||
notifyListeners();
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'package:anim_search/providers/data_provider.dart';
|
||||
import 'package:anim_search/types/category_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
@ -10,7 +11,7 @@ class ErrorScreen extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _ErrorScreenState extends State<ErrorScreen> {
|
||||
Future<void> getData(String category) async {
|
||||
Future<void> getData(CategoryType category) async {
|
||||
await Provider.of<DataProvider>(context, listen: false)
|
||||
.getHomeData(category: category);
|
||||
}
|
||||
@ -50,8 +51,8 @@ class _ErrorScreenState extends State<ErrorScreen> {
|
||||
),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
primary: Colors.orange,
|
||||
onPrimary: Colors.white,
|
||||
foregroundColor: Colors.white,
|
||||
backgroundColor: Colors.orange,
|
||||
padding: EdgeInsets.symmetric(horizontal: 25),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
@ -62,7 +63,7 @@ class _ErrorScreenState extends State<ErrorScreen> {
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
print('refreshed');
|
||||
getData('airing');
|
||||
getData(CategoryType.top);
|
||||
});
|
||||
})
|
||||
],
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:anim_search/providers/data_provider.dart';
|
||||
import 'package:anim_search/screens/anime_grid_screen.dart';
|
||||
import 'package:anim_search/types/category_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:material_floating_search_bar/material_floating_search_bar.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
@ -12,7 +13,7 @@ class HomeScreen extends StatefulWidget {
|
||||
class _HomeScreenState extends State<HomeScreen> {
|
||||
int _selectedIndex = 0;
|
||||
|
||||
Future<void> getData(String category) async {
|
||||
Future<void> getData(CategoryType category) async {
|
||||
await Provider.of<DataProvider>(context, listen: false)
|
||||
.getHomeData(category: category);
|
||||
}
|
||||
@ -21,7 +22,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
Provider.of<DataProvider>(context, listen: false).searchData(query);
|
||||
}
|
||||
|
||||
Widget _buttonBuilder(String name, int myIndex, String category) {
|
||||
Widget _buttonBuilder(String name, int myIndex, CategoryType category) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
@ -69,7 +70,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
onFocusChanged: (isFocused) {
|
||||
if (!isFocused) {
|
||||
setState(() {
|
||||
getData('airing');
|
||||
getData(CategoryType.top);
|
||||
});
|
||||
}
|
||||
},
|
||||
@ -79,13 +80,13 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
child: IconButton(
|
||||
icon: Icon(
|
||||
Icons.album_outlined,
|
||||
color: Theme.of(context).accentColor,
|
||||
color: Theme.of(context).colorScheme.secondary,
|
||||
),
|
||||
splashRadius: 25,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_selectedIndex = 0;
|
||||
getData('airing');
|
||||
getData(CategoryType.top);
|
||||
});
|
||||
}),
|
||||
),
|
||||
@ -106,12 +107,12 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
padding: EdgeInsets.symmetric(horizontal: 15),
|
||||
scrollDirection: Axis.horizontal,
|
||||
children: [
|
||||
_buttonBuilder('Top', 0, 'airing'),
|
||||
_buttonBuilder('Upcoming', 1, 'upcoming'),
|
||||
_buttonBuilder('Series', 2, 'tv'),
|
||||
_buttonBuilder('Movies', 3, 'movie'),
|
||||
_buttonBuilder('OVA', 4, 'ova'),
|
||||
_buttonBuilder('Special Release', 5, 'special'),
|
||||
_buttonBuilder('Top', 0, CategoryType.top),
|
||||
_buttonBuilder('Upcoming', 1, CategoryType.upcoming),
|
||||
_buttonBuilder('Series', 2, CategoryType.series),
|
||||
_buttonBuilder('Movies', 3, CategoryType.movie),
|
||||
_buttonBuilder('OVA', 4, CategoryType.ova),
|
||||
_buttonBuilder('Special Release', 5, CategoryType.special),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
1
lib/types/category_type.dart
Normal file
1
lib/types/category_type.dart
Normal file
@ -0,0 +1 @@
|
||||
enum CategoryType { top, upcoming, series, movie, ova, special }
|
@ -12,8 +12,13 @@ class WebViewContainer extends StatefulWidget {
|
||||
|
||||
class _WebViewContainerState extends State<WebViewContainer> {
|
||||
final _key = UniqueKey();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final _controller = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||
..loadRequest(Uri.parse(widget.url));
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
iconTheme: IconThemeData(
|
||||
@ -21,11 +26,7 @@ class _WebViewContainerState extends State<WebViewContainer> {
|
||||
),
|
||||
backgroundColor: Colors.orange,
|
||||
),
|
||||
body: WebView(
|
||||
key: _key,
|
||||
javascriptMode: JavascriptMode.unrestricted,
|
||||
initialUrl: widget.url,
|
||||
),
|
||||
body: WebViewWidget(key: _key, controller: _controller),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -23,11 +23,11 @@ environment:
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
provider: ^5.0.0
|
||||
provider: ^6.0.5
|
||||
dio: ^4.0.0
|
||||
flutter_staggered_grid_view: ^0.4.0
|
||||
flutter_staggered_grid_view: ^0.6.2
|
||||
material_floating_search_bar: ^0.3.4
|
||||
webview_flutter: ^2.0.9
|
||||
webview_flutter: ^4.0.1
|
||||
auto_animated: ^3.0.0
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
|
Reference in New Issue
Block a user