Merge pull request #3 from sbuckner6/main

Jikan API v4 Migration
This commit is contained in:
Ariz Armeidi
2023-01-07 03:52:20 +07:00
committed by GitHub
10 changed files with 70 additions and 36 deletions

7
lib/constants.dart Normal file
View 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';

View File

@ -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: {

View File

@ -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'] ?? '',

View File

@ -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'],
);
}

View File

@ -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();

View File

@ -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);
});
})
],

View File

@ -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),
],
),
),

View File

@ -0,0 +1 @@
enum CategoryType { top, upcoming, series, movie, ova, special }

View File

@ -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),
);
}
}

View File

@ -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.