26
loading...
This website collects cookies to deliver better user experience
AnimeApp
class to reflect this.class AnimeApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Anime app',
debugShowCheckedModeBanner: false,
initialRoute: '/',
routes: {
'/': (context) => HomePage(),
'/detail': (context) => DetailPage(item: 0, title: ''),
},
);
}
}
HomePage
, which was our previous main application.item
and the title
. We use these to render the top bar and fetch the details for this show.class HomePage extends StatefulWidget {
HomePage({Key? key}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
// Same as before
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Anime app')),
body: Center(
// Same
)
)
}
class DetailPage extends StatefulWidget {
final int item;
final String title;
DetailPage({Key? key, required this.item, required this.title})
: super(key: key);
@override
_DetailPageState createState() => _DetailPageState();
}
class _DetailPageState extends State<DetailPage> {
late Future<List<Episode>> episodes;
@override
void initState() {
super.initState();
episodes = fetchEpisodes(widget.item);
}
@override
Widget build(BuildContext context) {
}
}
widget.{variable}
call.Show
class in the previous article.class Episode {
final int episodeId;
final String title;
Episode({required this.episodeId, required this.title});
factory Episode.fromJson(Map<String, dynamic> json) {
return Episode(episodeId: json['episode_id'], title: json['title']);
}
}
Future<List<Episode>> fetchEpisodes(id) async {
final response = await http
.get(Uri.parse('https://api.jikan.moe/v3/anime/${id}/episodes/1'));
if (response.statusCode == 200) {
var episodesJson = jsonDecode(response.body)['episodes'] as List;
return episodesJson.map((episode) => Episode.fromJson(episode)).toList();
} else {
throw Exception('Failed to load episodes');
}
}
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
body: Center(
child: FutureBuilder(
builder: (context, AsyncSnapshot<List<Episode>> snapshot) {
if (snapshot.hasData) {
return Center(
child: ListView.separated(
padding: const EdgeInsets.all(8),
itemCount: snapshot.data!.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
leading: CircleAvatar(
child: Text('${snapshot.data![index].episodeId}')),
title: Text(snapshot.data![index].title),
);
},
separatorBuilder: (BuildContext context, int index) =>
const Divider(),
),
);
} else if (snapshot.hasError) {
return Center(child: Text('Something went wrong :('));
}
return CircularProgressIndicator();
},
future: episodes,
)),
);
widget.title
to get the parameter title and set this as the AppBar title text.onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
DetailPage(
item: snapshot.data![index].malId,
title: snapshot.data![index].title,
),
),
);
},
main.dart
file is getting quite big.lib
folder.home.dart
detail.dart
home.dart
file.import 'package:flutter/material.dart';
import 'package:flutter_app/screens/detail.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class HomePage extends StatefulWidget {
// Widget code
}
class _HomePageState extends State<HomePage> {
// State code
}
class Show {
// Class code
}
Future<List<Show>> fetchShows() async {
// Future code
}
detail.dart
file.import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class DetailPage extends StatefulWidget {
// Widget code
}
class _DetailPageState extends State<DetailPage> {
// State code
}
class Episode {
// Class code
}
Future<List<Episode>> fetchEpisodes(id) async {
// Future code
}
main.dart
file now should look like this:import 'package:flutter/material.dart';
import 'package:flutter_app/screens/home.dart';
import 'package:flutter_app/screens/detail.dart';
void main() async {
runApp(AnimeApp());
}
class AnimeApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Anime app',
debugShowCheckedModeBanner: false,
initialRoute: '/',
routes: {
'/': (context) => HomePage(),
'/detail': (context) => DetailPage(item: 0, title: ''),
},
);
}
}