pparth602

home_page.dart

Apr 26th, 2021
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 8.90 KB | None | 0 0
  1. import 'package:cloud_firestore/cloud_firestore.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
  4. import 'package:learnship/pages/courselist_page/courselist_page.dart';
  5. import 'package:learnship/pages/home_page/search_page.dart';
  6. import 'package:youtube_api/youtube_api.dart';
  7. import 'package:youtube_explode_dart/youtube_explode_dart.dart';
  8. import 'package:youtube_parser/youtube_parser.dart';
  9.  
  10. class HomePage extends StatefulWidget {
  11.   HomePage({Key key}) : super(key: key);
  12.  
  13.   @override
  14.   _HomePageState createState() => _HomePageState();
  15. }
  16.  
  17. class _HomePageState extends State<HomePage> {
  18.   static String key = "AIzaSyB5Spz0ROPoQ0J1HsorKOldqIsEeshMaSk";
  19.   TextEditingController searchController = TextEditingController();
  20.   var yt = YoutubeExplode();
  21.   YoutubeAPI ytApi = YoutubeAPI(key);
  22.   List<YT_API> ytResult = [];
  23.   List<Video> videoModels = [];
  24.   List<String> videoUrls = [];
  25.   List<String> videoIDs = [];
  26.   List<String> videoTitles = [];
  27.  
  28.   callAPI() async {
  29.     ytResult = await ytApi.search(searchController.text);
  30.     // ytResult = await ytApi.nextPage();
  31.     // ytResult = await ytApi.nextPage();
  32.     setState(() {});
  33.   }
  34.  
  35.   void getTitles(List<String> videoUrls) async {
  36.     print("==========>$videoUrls");
  37.     for (int i = 0; i < videoUrls.length; i++) {
  38.       print('=============> $i <=======>');
  39.       videoModels[i] = await yt.videos
  40.           .get(videoUrls[i])
  41.           .then((value) => videoModels[i] = value);
  42.     }
  43.   }
  44.  
  45.   @override
  46.   void initState() {
  47.     super.initState();
  48.     //callAPI();
  49.     this.getTitles(videoUrls);
  50.     print('hello');
  51.   }
  52.  
  53.   List<String> imageList = [
  54.     'assets/course_image/Data Structures.jpg',
  55.     'assets/course_image/database_1.jpg',
  56.     'assets/course_image/Database.jpg',
  57.     'assets/course_image/flutter.jpg',
  58.     'assets/course_image/ML.jpg'
  59.   ];
  60.  
  61.   @override
  62.   Widget build(BuildContext context) {
  63.     Size size = MediaQuery.of(context).size;
  64.     return Scaffold(
  65.       backgroundColor: Color(0xFFF8F8F8),
  66.       body: Column(
  67.         children: [
  68.           Row(
  69.             mainAxisAlignment: MainAxisAlignment.spaceBetween,
  70.             children: [
  71.               Spacer(
  72.                 flex: 1,
  73.               ),
  74.               Text(
  75.                 'Hi, Parth!',
  76.                 style: TextStyle(
  77.                   fontSize: size.height * 0.04,
  78.                   fontWeight: FontWeight.bold,
  79.                 ),
  80.               ),
  81.               Spacer(
  82.                 flex: 9,
  83.               ),
  84.               CircleAvatar(
  85.                 radius: size.height * 0.04,
  86.                 backgroundImage: AssetImage('assets/course_image/Parth.jpg'),
  87.               ),
  88.               Spacer(
  89.                 flex: 2,
  90.               ),
  91.             ],
  92.           ), // Header
  93.           Container(
  94.             padding: EdgeInsets.all(10),
  95.             //  padding: EdgeInsets.only(top: 8, bottom: 8),
  96.             margin: EdgeInsets.only(left: 8, right: 8),
  97.             child: Material(
  98.               elevation: 10.0,
  99.               borderRadius: BorderRadius.all(Radius.circular(30.0)),
  100.               child: TextField(
  101.                 controller: searchController,
  102.                 style: TextStyle(color: Colors.black, fontSize: 22.0),
  103.                 cursorColor: Theme.of(context).primaryColor,
  104.                 decoration: InputDecoration(
  105.                     contentPadding:
  106.                         EdgeInsets.symmetric(horizontal: 32.0, vertical: 14.0),
  107.                     prefixIcon: InkWell(
  108.                       onTap: () {
  109.                         Navigator.push(
  110.                           context,
  111.                           MaterialPageRoute(
  112.                             builder: (context) => SearchPage(
  113.                               searchQuery: searchController.text,
  114.                               ytApi: ytApi,
  115.                             ),
  116.                           ),
  117.                         );
  118.                       },
  119.                       child: Icon(
  120.                         Icons.search,
  121.                         color: Colors.black,
  122.                       ),
  123.                     ),
  124.                     border: InputBorder.none,
  125.                     hintText: "Search"),
  126.               ),
  127.             ),
  128.           ), //Search Bar
  129.           _space,
  130.           Expanded(
  131.             child: Container(
  132.               margin: EdgeInsets.all(12),
  133.               child: StreamBuilder(
  134.                   stream: FirebaseFirestore.instance
  135.                       .collection("courses")
  136.                       .snapshots(),
  137.                   builder: (BuildContext context,
  138.                       AsyncSnapshot<QuerySnapshot> snapshot) {
  139.                     return !snapshot.hasData
  140.                         ? Center(
  141.                             child: CircularProgressIndicator(),
  142.                           )
  143.                         : StaggeredGridView.countBuilder(
  144.                             crossAxisCount: 2,
  145.                             shrinkWrap: true,
  146.                             crossAxisSpacing: 12,
  147.                             mainAxisSpacing: 12,
  148.                             itemCount: snapshot.data.docs.length,
  149.                             itemBuilder: (context, index) {
  150.                               DocumentSnapshot courses =
  151.                                   snapshot.data.docs[index];
  152.                               final _videoUrls = courses.get("courseItems");
  153.  
  154.                               videoUrls = _videoUrls
  155.                                   .map<String>((e) => e.toString())
  156.                                   .toList();
  157.                               videoIDs = _videoUrls
  158.                                   .map<String>((e) => getIdFromUrl(e))
  159.                                   .toList();
  160.  
  161.                               print('============> Video Ids: $videoIDs');
  162.                               return Column(
  163.                                 children: [
  164.                                   Expanded(
  165.                                     child: GestureDetector(
  166.                                       onTap: () {
  167.                                         Navigator.push(
  168.                                           context,
  169.                                           MaterialPageRoute(
  170.                                             builder: (context) =>
  171.                                                 CourseListPage(
  172.                                               videoIds: videoIDs,
  173.                                               itemCount: videoUrls.length,
  174.                                               courses: courses,
  175.                                               videoUrls: videoUrls,
  176.                                             ),
  177.                                           ),
  178.                                         );
  179.                                       },
  180.                                       child: ClipRRect(
  181.                                         borderRadius: BorderRadius.all(
  182.                                             Radius.circular(12)),
  183.                                         child: Image.network(courses['imgUrl'],
  184.                                             fit: BoxFit.cover,
  185.                                             height: size.height * 0.3),
  186.                                       ),
  187.                                     ),
  188.                                   ),
  189.                                   Row(
  190.                                     mainAxisSize: MainAxisSize.max,
  191.                                     mainAxisAlignment:
  192.                                         MainAxisAlignment.spaceBetween,
  193.                                     children: [
  194.                                       SizedBox(
  195.                                         width: 3,
  196.                                       ),
  197.                                       Expanded(
  198.                                         child: Text(
  199.                                           courses['courseTitle'],
  200.                                           style: TextStyle(
  201.                                               fontWeight: FontWeight.bold),
  202.                                           softWrap: true,
  203.                                           maxLines: 3,
  204.                                           overflow: TextOverflow.ellipsis,
  205.                                         ),
  206.                                       ),
  207.                                     ],
  208.                                   ),
  209.                                 ],
  210.                               );
  211.                             },
  212.                             staggeredTileBuilder: (index) {
  213.                               return new StaggeredTile.count(
  214.                                   1, index.isEven ? 1.2 : 1.8);
  215.                             },
  216.                           );
  217.                   }),
  218.             ),
  219.           ),
  220.         ],
  221.       ),
  222.     );
  223.   }
  224.  
  225.   Widget get _space => const SizedBox(height: 10);
  226. }
  227.  
  228.  
  229.  
Advertisement
Add Comment
Please, Sign In to add comment