Menampilkan Video Youtube Populer di Aplikasi Flutter dengan Youtube API

Share:
Menampilkan Video Youtube Populer di Aplikasi Flutter dengan Youtube API

Halo semuanya, kembali lagi di sahretech. Pada kesempatan kali ini kita akan belajar cara menampilkan video populer youtube dengan youtube API di aplikasi flutter. Penasaran?, ayo ikuti selengkapnya di bawah ini.


Sebelumnya saya sudah membuat tutorial cara menampilkan video youtube dengan youtube api di flutter. Berikut ini link artikelnya https://www.sahretech.com/2023/07/cara-menampilkan-video-youtube-dari-api.html

Perbedaanya dengan tutorial kali ini adalah, kita akan menampilkan video populer youtube tapi masih dengan menggunakan youtube api. Selain itu kita akan menampilkan juga total like dan total viewnya. Sehingga model dan tampilannya juga akan kita modifikasi. Scroll ke bagian paling bawah artikel ini untuk melihat hasil akhirnya.


Baca Artikel Lain ✨
📰 1. Membuat Restful Api di Laravel Tanpa Library Tambahan Part 1 read more
📰 2. Menampilkan Data dengan API dan Token di Laravel Part 2 read more
📰 3. Cara Membuat Custom Registrasi dan Prosesnya di Laravel Part 1 read more
📰 4. Cara Membuat Custom Login di Laravel Part 2 read more


Menampilkan Video Youtube Populer di Aplikasi Flutter dengan Youtube API

1. Pertama dan yang paling utama, kalian harus memiliki youtube api key terlebih dahulu. Jika belum memilikinya silahkan ikuti tutorial berikut ini https://www.sahretech.com/2023/07/cara-mendapatkan-youtube-api-key.html

2. Buatlah sebuah file baru dengan nama yang kalian inginkan. flutter yang digunakan adalah versi null safety. sdk: ">=2.16.2 <3.0.0". Selisih versi lebih rendah sedikit atau lebih tinggi sedikit tidak masalah. 

3. Buka pubspec.yaml. Lalu tambahkan http: ^0.13.5 dan youtube_player_flutter: ^8.0.0 ikuti contohnya seperti gambar di bawah ini.

Mengunduh Paket



4. Buat file baru di dalam folder lib  dengan nama video_model.dart lalu ikuti script di bawah ini.



class Video { final String id; final String title; final String thumbnail; final String channelTitle; final int viewCount; final int likeCount; Video({ required this.id, required this.title, required this.thumbnail, required this.channelTitle, required this.viewCount, required this.likeCount, }); factory Video.fromJson(Map<String, dynamic> json) { return Video( id: json['id'] ?? '', title: json['snippet']['title'] ?? '', thumbnail: json['snippet']['thumbnails']['high']['url'] ?? '', channelTitle: json['snippet']['channelTitle'] ?? '', viewCount: int.tryParse(json['statistics']['viewCount']) ?? 0, likeCount: int.tryParse(json['statistics']['likeCount']) ?? 0, ); } }


5. Buat file baru di dalam folder lib dengan nama youtube_api.dart lalu ikuti script di bawah ini. Jangan lupa untuk mengganti key=YOUR_KEY dengan youtube api key yang kalian punya.



import 'dart:convert'; import 'package:http/http.dart' as http; import 'video_model.dart'; class YouTubeApi { Future<List<Video>> getVideos() async { final url = 'https://www.googleapis.com/youtube/v3/videos' '?part=snippet' '&part=statistics' '&chart=mostPopular' '&maxResults=10' '&type=video' '&key=YOUR_KEY'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { final jsonData = json.decode(response.body); final videoList = jsonData['items'] as List<dynamic>; return videoList.map((item) => Video.fromJson(item)).toList(); } else { throw Exception('Failed to load videos'); } } }


5. Buat sebuah file baru di dalam folder lib dengan nama detail.dart lalu ikuti script di bawah ini.

 

import 'package:flutter/material.dart'; import 'package:youtube_player_flutter/youtube_player_flutter.dart'; import 'video_model.dart'; import 'youtube_api.dart'; class Detail extends StatefulWidget { final String videoId; final String title; Detail({ required this.videoId, required this.title, }); @override State<Detail> createState() => _DetailState(); } class _DetailState extends State<Detail> { late YoutubePlayerController _controller; @override void initState() { super.initState(); _controller = YoutubePlayerController( initialVideoId: YoutubePlayer.convertUrlToId( 'https://www.youtube.com/watch?v=' + widget.videoId)!, flags: const YoutubePlayerFlags( autoPlay: false, mute: false, ), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Video Detail'), ), body: ListView( children: [ YoutubePlayer( controller: _controller, showVideoProgressIndicator: true, progressIndicatorColor: Colors.blueAccent, ), Padding( padding: const EdgeInsets.all(8.0), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( width: 35, height: 35, decoration: const BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), image: DecorationImage( fit: BoxFit.cover, image: NetworkImage( 'https://cdn.pixabay.com/photo/2016/11/18/23/38/child-1837375_640.png', ), ), ), ), const SizedBox( width: 10, ), Expanded( child: Text( widget.title, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w400), maxLines: 2, overflow: TextOverflow.ellipsis, ), ), ], ), const SizedBox( height: 20, ), const Text( 'See Other Videos', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500), ), const SizedBox( height: 15, ), FutureBuilder<List<Video>>( future: YouTubeApi().getVideos(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return Center( child: CircularProgressIndicator(), ); } else if (snapshot.hasData) { final videos = snapshot.data!; return ListView.builder( padding: EdgeInsets.zero, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: videos.length, itemBuilder: (context, index) { final video = videos[index]; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ InkWell( onTap: () => { Navigator.push( context, MaterialPageRoute( builder: (context) => Detail( videoId: video.id, title: video.title, ), ), ) }, child: ListTile( contentPadding: EdgeInsets.zero, leading: Image.network( video.thumbnail, fit: BoxFit.cover, width: 120, ), title: Text( video.title, maxLines: 2, overflow: TextOverflow.ellipsis, ), ), ), const SizedBox( height: 8, ), ], ); }, ); } else if (snapshot.hasError) { return Center( child: Text('Error: ${snapshot.error}'), ); } else { return Center( child: Text('Failed to load videos'), ); } }, ), ], ), ) ], ), ); } }



6. Buka lib/main.dart kemudian ikuti script di bawah ini.



import 'package:flutter/material.dart'; import 'detail.dart'; import 'video_model.dart'; import 'youtube_api.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { String formatNumber(dynamic number) { if (number >= 1000000) { return (number ~/ 1000000).toString() + ' jt'; } else if (number >= 1000) { return (number ~/ 1000).toString() + ' rb'; } else { return number.toString(); } } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('YouTube Videos'), ), body: FutureBuilder<List<Video>>( future: YouTubeApi().getVideos(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return Center( child: CircularProgressIndicator(), ); } else if (snapshot.hasData) { final videos = snapshot.data!; return ListView.builder( itemCount: videos.length, itemBuilder: (context, index) { final video = videos[index]; return InkWell( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => Detail( videoId: video.id, title: video.title, ), ), ); }, child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Image.network( video.thumbnail, width: double.infinity, height: 160, fit: BoxFit.cover, ), const SizedBox( height: 5, ), Padding( padding: EdgeInsets.all(8), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( width: 45, height: 45, decoration: const BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), image: DecorationImage( fit: BoxFit.cover, image: NetworkImage( 'https://cdn.pixabay.com/photo/2016/11/18/23/38/child-1837375_640.png', ), ), ), ), const SizedBox( width: 10, ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( video.title, style: const TextStyle( fontSize: 16, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), SizedBox( height: 5, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( video.channelTitle, style: const TextStyle( fontSize: 12, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), Row( children: [ Icon( Icons.thumb_up, size: 14, ), SizedBox(width: 5), Text( formatNumber(video.likeCount), style: const TextStyle( fontSize: 12, ), ), SizedBox(width: 10), Icon( Icons.remove_red_eye, size: 14, ), SizedBox(width: 5), Text( formatNumber(video.viewCount), style: const TextStyle( fontSize: 12, ), ), SizedBox(width: 16,) ], ) ], ), ], ), ), ], ), ), SizedBox( height: 10, ) ], ), ), ); }, ); } else if (snapshot.hasError) { return Center( child: Text('Error: ${snapshot.error}'), ); } else { return Center( child: Text('Failed to load videos'), ); } }, ), ), ); } }


Jika semua step sudah kita kerjakan, saatnnya kita lakukan uji coba. Silahkan jalankan emulator, jika berhasil maka tampilannya akan tampak seperti gambar di bawah ini.

sahretechsahretech



Mudah bukan?, sekarang kalian bisa menampilkan data dari youtube dan mengolahnya ke dalam berbagai kebutuhan aplikasi yang kalian miliki. Kalian dapat melakukan improvisasi dengan nemambahkan pencarian atau menampilkan video dengan kategori tertentu.


Ok sekian tutorial kali ini tentan cara menampilkan video youtube populer di aplikasi flutter dengan youtube api. Semoga tutorial singkat ini bermanfaat, jika terjadi kendala silahkan laporkan langsung di kolom komentar di bawah ini. Sekian dan terima gaji.

No comments

Jangan lupa kasih komentar ya!. Karena komentar kalian membantu kami menyediakan informasi yang lebih baik

Tidak boleh menyertakan link atau promosi produk saat berkomentar. Komentar tidak akan ditampilkan. Hubungi 081271449921(WA) untuk dapat menyertakan link dan promosi