Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 30.07 KB | None | 0 0
  1. import 'dart:async';
  2. import 'dart:core';
  3. import 'dart:io';
  4. import 'package:cached_network_image/cached_network_image.dart';
  5. import 'package:image_picker/image_picker.dart';
  6. import 'package:flutter/cupertino.dart';
  7. import 'package:cloud_firestore/cloud_firestore.dart';
  8. import 'package:yogurt/FireStore.dart';
  9. import 'package:yogurt/images.dart';
  10. import 'package:yogurt/settings.dart';
  11. import 'package:yogurt/past_orders.dart';
  12. import 'Colors.dart';
  13. import 'package:flutter/material.dart';
  14. import 'package:firebase_auth/firebase_auth.dart';
  15. import 'package:animated_text_kit/animated_text_kit.dart';
  16. import 'package:path_provider/path_provider.dart';
  17.  
  18. class OrderList extends StatefulWidget {
  19.   static const String routeName = "/OrderList";
  20.   final FirebaseUser user;
  21.  
  22.   OrderList(this.user);
  23.  
  24.   @override
  25.   _OrderListState createState() => _OrderListState(user: user);
  26. }
  27.  
  28. class _OrderListState extends State<OrderList> {
  29.   FirebaseUser user;
  30.  
  31.   _OrderListState({this.user});
  32.  
  33.   final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  34.   PageController controller = PageController();
  35.   PageController itemView = PageController(viewportFraction: 0.95);
  36.   ScrollController sc = ScrollController(initialScrollOffset: 70);
  37.  
  38.   //Map<String, Map<String, dynamic>> mapa = <String, Map<String, dynamic>>{};
  39.   Map<String, dynamic> availableItems =
  40.       <String, dynamic>{}; //!Mapa za izdelki ki so na voljo
  41.   Map selectedItems = new Map(); //!Mapa z izbranimi izdelki
  42.   //Map<String, String> slikeCached = <String, String>{};
  43.  
  44.   //var list_name = new List();
  45.   //var currentPageValue = 0.0;
  46.   //double _viewportScale = 1;
  47.   Directory dir = Directory
  48.       .systemTemp; //!Temporary system directory where the images are stored -> CACHED
  49.   var myDir; //!Variable that holds the path to temporary directory
  50.  
  51.   String userID; //!FirebaseUser id <- currently loged user
  52.  
  53.   final Firestore yogurts = Firestore.instance;
  54.   final Firestore users = Firestore.instance;
  55.   Stream items; //!Stream for items
  56.   Stream userData; //!Stream for userData
  57.  
  58.   List users_selectedItems;
  59.   int cnt = 0;
  60.   int current_page = 0;
  61.  
  62.   List<FileSystemEntity> _images;
  63.  
  64.   //!Hardcoded file paths
  65.   var slike = ["assets/breskev.jpg", "assets/jagoda.jpg", "assets/vanilla_coko.jpg"];
  66.   var slikeMap = {
  67.     0: 'assets/breskev.jpg',
  68.     1: 'assets/jagoda.jpg',
  69.     2: "assets/vanilla_coko.jpg"
  70.   };
  71.   var iconsMap = {
  72.     "Breskev": "assets/breskev.png",
  73.     "Jagoda": "assets/jagoda.png",
  74.     "Vanilija Coko": "assets/choco_vanilla.png"
  75.   };
  76.   var slikeCached = {
  77.     0: '/data/user/0/com.example.yogurt/code_cache/marelica.jpg',
  78.     1: '/data/user/0/com.example.yogurt/code_cache/jagoda.jpg',
  79.     2: '/data/user/0/com.example.yogurt/code_cache/vanilija_coko.jpg'
  80.   };
  81.  
  82.   StreamController<Stream> _postStreamController = StreamController<Stream>();
  83.  
  84.   @override
  85.   void initState() {
  86.     super.initState();
  87.  
  88.     myDir = new Directory(dir.path);
  89.     userID = user.uid;
  90.  
  91.     //_images = myDir.listSync(recursive: true, followLinks: false);
  92.     print(myDir);
  93.     print(_images);
  94.  
  95.     //items = FetchFromFirestore().queryItems() as Stream;
  96.     //userData = FetchFromFirestore().queryUserData(userID) as Stream;
  97.     queryItems(); //!Stream for items currently availble
  98.     queryUserData(); //!Stream for userData of the loged user
  99.  
  100.     //!Page Controller za prehajanje med SelectionScreen in Cart
  101.     controller = PageController(
  102.       initialPage: 0,
  103.       viewportFraction: 1,
  104.     );
  105.  
  106.     itemView.addListener(() {
  107.       int next = itemView.page.round();
  108.       if (current_page != next) {
  109.         setState(() {
  110.           current_page = next;
  111.         });
  112.       }
  113.     });
  114.   }
  115.  
  116.   /*
  117.   void assignItems() {
  118.     FilterIfAvailable() //!klici metodo za filtriranje izdelkov ki pretvori Firestore.instance v QuerySnapshot
  119.         .getImages()
  120.         .then((QuerySnapshot docs) async {
  121.       if (docs.documents.isNotEmpty) {
  122.         //!If dacuments not empty
  123.         for (var i = 0; i < docs.documents.length; i++) {
  124.           var itemData = docs.documents[i].data;
  125.           availableItems[itemData['ime']] =
  126.               itemData; //!Napolni Map z izdelki ..... jagoda.jpg :  item_data
  127.         }
  128.       }
  129.     }).catchError((e) {
  130.       print("Got error: ${e.error}");
  131.     });
  132.   }
  133.   */
  134.  
  135.   void queryItems() async {
  136.     //!Fetch items
  137.     try {
  138.       Query query = await
  139.           yogurts.collection('current_items').where("available", isEqualTo: true);
  140.       //!Filter available izdelke
  141.       //*QuerySnapshot contains zero or more QueryDocumentSnapshot objects representing the results of a query
  142.       items = query.snapshots().map((list) {
  143.         //!Convert stream to map on the fly ->
  144.         return list.documents.map((doc) {
  145.           //*For every document
  146.           return doc.data; //*Data from every document
  147.         });
  148.       });
  149.       _postStreamController.add(items);
  150.     } catch (e) {
  151.       print("Got error: ${e.error}");
  152.     }
  153.   }
  154.  
  155.   void queryUserData() async {
  156.     //!Fetch userData
  157.     try {
  158.       Query query2 = users.collection('users').where("uid", isEqualTo: userID); //!Users
  159.       userData = query2.snapshots().map((list) {
  160.         return list.documents.map((doc) {
  161.           return doc.data;
  162.         });
  163.       });
  164.     } catch (e) {
  165.       print("Got error: ${e.error}");
  166.     }
  167.   }
  168.  
  169.   @override
  170.   void dispose() {
  171.     controller.dispose();
  172.     itemView.dispose();
  173.     sc.dispose();
  174.     super.dispose();
  175.   }
  176.  
  177.   //!ZOOMER
  178.   @override
  179.   Widget build(BuildContext context) {
  180.     final zoomItem = Hero(
  181.       tag: "jagoda",
  182.       child: Container(
  183.         width: MediaQuery.of(context).size.width / 1.5,
  184.         height: MediaQuery.of(context).size.height / 1.5,
  185.         decoration: new BoxDecoration(
  186.             image: new DecorationImage(
  187.                 fit: BoxFit.fill, image: AssetImage("assets/jagoda.jpg"))),
  188.       ),
  189.     );
  190.  
  191.  
  192.     //!Metoda za animiran transition med Selection in Cart screen-om
  193.     bool onWillPop() {
  194.       controller.previousPage(
  195.         duration: Duration(milliseconds: 300),
  196.         curve: Curves.linear,
  197.       );
  198.       return false;
  199.     }
  200.  
  201.     //!BUILDS MAIN SELECTION SCREEN
  202.     return Scaffold(
  203.       key: _scaffoldKey,
  204.       backgroundColor: WHITE,
  205.       body: PageView(
  206.         //*PageView za prehajanje iz seznama izdelkov v košarico
  207.         onPageChanged: (num) {
  208.           print("Current page number is: " + num.toString());
  209.         },
  210.         //?physics: BouncingScrollPhysics(),
  211.         controller: controller,
  212.         scrollDirection: Axis.vertical,
  213.         pageSnapping: true,
  214.         children: <Widget>[
  215.           buildSelectionMenu(context), //!SelectionScreen
  216.           buildCartPage(onWillPop, context), //!Cart Screen
  217.         ],
  218.       ),
  219.     );
  220.   }
  221.  
  222.   Container buildSelectionMenu(BuildContext context) => Container(
  223.         //!Ustvari main page
  224.         height: MediaQuery.of(context).size.height, //*Višina zaslona
  225.         width: MediaQuery.of(context).size.width, //*Širina zaslona
  226.         color: Colors.transparent,
  227.         child: Column(
  228.           //!Nov stack za ListView izdelkov
  229.           crossAxisAlignment: CrossAxisAlignment.center,
  230.           mainAxisSize: MainAxisSize.max,
  231.           children: <Widget>[
  232.             //!ZGORNJI CONTAINER V KATEREM SE NAHAJA SELECTION
  233.             buildSelection(context),
  234.             buildBonusCounter(
  235.                 context), //!Zgradi Row pod MainContainerjem na SelectionScreenu
  236.           ],
  237.         ),
  238.       );
  239.  
  240.   Container buildSelection(BuildContext context) {
  241.     return Container(
  242.       height: MediaQuery.of(context).size.height *
  243.           0.9, //!Višina containerja je 90% višine ekrana
  244.       decoration: new BoxDecoration(
  245.           boxShadow: [
  246.             new BoxShadow(
  247.               color: Colors.black.withOpacity(0.6), //*Black shadow okoli
  248.               offset: new Offset(1.0, 2.0), //*z offsetom
  249.               blurRadius: 15.0,
  250.             )
  251.           ],
  252.           color: THEME_COLOR.withOpacity(0.9), //*Tema
  253.           borderRadius: new BorderRadius.only(
  254.               //*Oglati robovi
  255.               bottomLeft: const Radius.circular(55.0),
  256.               bottomRight: const Radius.circular(55.0))),
  257.       child: Column(
  258.         crossAxisAlignment: CrossAxisAlignment.center,
  259.         mainAxisSize: MainAxisSize.max,
  260.         mainAxisAlignment: MainAxisAlignment.start,
  261.         children: <Widget>[
  262.           Padding(
  263.             //!Vrsta za orders in settings icone
  264.             padding: const EdgeInsets.only(left: 20, right: 20, top: 25),
  265.             child: Row(
  266.               mainAxisSize: MainAxisSize.max,
  267.               mainAxisAlignment: MainAxisAlignment
  268.                   .spaceBetween, //!Porazdeli ikone levo in desno z spaco-om vmes
  269.               children: <Widget>[
  270.                 new OrdersIcon(user: user),
  271.                 new SettingsIcon(user: user),
  272.               ],
  273.             ),
  274.           ),
  275.           //!Stream builder za grajenje seznama izdelkov iz baze
  276.           StreamBuilder(
  277.             //!Posluša in rebuilda seznam for every new event
  278.             stream: _postStreamController.stream, //?single-subscription stream from the future
  279.             initialData: [],
  280.             builder: (context, AsyncSnapshot snap) {
  281.               //*Rebuilds its childer whenever a new value gets emited by the stream
  282.               List slideList = snap.data.toList(); //! Convert AsynSnapshot into List
  283.               print("Number of all items:" + slideList.length.toString());
  284.               if (snap.connectionState == ConnectionState.waiting) {
  285.                 return Center(
  286.                   child: CircularProgressIndicator(
  287.                     valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
  288.                   ),
  289.                 );
  290.               } else {
  291.                 return Container(
  292.                   height: MediaQuery.of(context).size.height * 0.7,
  293.                   child: PageView.builder(
  294.                     onPageChanged: (num) {
  295.                       print("Current index: " + num.toString());
  296.                     },
  297.                     controller: itemView, //!Pass PageView controller
  298.                     scrollDirection: Axis.horizontal,
  299.                     itemCount: slideList.length, //!Število elementov je dolžina lista
  300.                     itemBuilder: (context, int currentIndex) {
  301.                       //!Build current facing item
  302.                       bool active = (currentIndex == current_page);
  303.                       //print(active.toString());
  304.                       //print("Trenutni index: " + currentIndex.toString() + " Trenutna stran: " + current_page.toString());
  305.                       //?(Lastnosti izdelka kot Map, bool trenutno aktiven, trenutni facing element)
  306.                       return buildProductListPage(
  307.                           slideList[currentIndex], active, currentIndex);
  308.                     },
  309.                   ),
  310.                 );
  311.               }
  312.             },
  313.           ),
  314.           Expanded(
  315.             flex: 2,
  316.                       child: Align(
  317.               //!Cart pod containerjem
  318.               alignment: Alignment.bottomCenter,
  319.               child: Padding(
  320.                 padding: const EdgeInsets.only(bottom: 10.0),
  321.                 child: InkWell(
  322.                   onTap: () {
  323.                     controller.animateTo(500.0,
  324.                         curve: Curves.linear, duration: Duration(milliseconds: 500));
  325.                   },
  326.                   child: Stack(
  327.                     alignment: Alignment.topCenter,
  328.                     children: <Widget>[
  329.                       SizedBox(
  330.                         //!Box ki vsebuje animiran text in te vrze na CartScreen
  331.                         child: ScaleAnimatedTextKit(
  332.                             onTap: () {
  333.                               controller.animateTo(500.0,
  334.                                   curve: Curves.linear,
  335.                                   duration: Duration(milliseconds: 500));
  336.                             },
  337.                             text: ["Cart"],
  338.                             textStyle:
  339.                                 TextStyle(fontSize: 35.0, fontFamily: "MadeEvolveSans"),
  340.                             textAlign: TextAlign.center,
  341.                             alignment:
  342.                                 AlignmentDirectional.topStart //! or Alignment.topLeft
  343.                             ),
  344.                       ),
  345.                       Padding(
  346.                         padding: const EdgeInsets.only(top: 28.0),
  347.                         child: Icon(
  348.                           Icons.keyboard_arrow_down,
  349.                           size: 34,
  350.                         ),
  351.                       ),
  352.                     ],
  353.                   ),
  354.                 ),
  355.               ),
  356.             ),
  357.           ),
  358.         ],
  359.       ),
  360.     );
  361.   }
  362.  
  363.   //!Build list view of products
  364.   buildProductListPage(Map data, bool active, var index) {
  365.     final double blur = active ? 5 : 0;
  366.     final double offset = active ? 2 : 0;
  367.     final double top = active ? 30 : 200;
  368.     final double iconSize = active ? 50 : 0;
  369.     final String ime = data['file_name'];
  370.     final String path = "${dir.path}/$ime";
  371.     print(path);
  372.     return AnimatedContainer(
  373.       height: 600,
  374.       width: 400,
  375.       duration: Duration(milliseconds: 1200),
  376.       curve: Curves.easeOutQuint,
  377.       margin: EdgeInsets.only(top: top, bottom: 10, right: 15, left: 15),
  378.       decoration: BoxDecoration(
  379.           borderRadius: BorderRadius.circular(20.0),
  380.           image: DecorationImage(fit: BoxFit.cover, image: AssetImage(path)),
  381.           boxShadow: [
  382.             BoxShadow(
  383.               color: Colors.black.withOpacity(0.7),
  384.               offset: new Offset(offset / 2, offset),
  385.               blurRadius: blur,
  386.             )
  387.           ]),
  388.       child: Stack(
  389.         children: <Widget>[
  390.           Column(
  391.             children: <Widget>[
  392.               Align(
  393.                 alignment: Alignment.topCenter,
  394.                 child: Padding(
  395.                   padding: const EdgeInsets.only(top: 15.0),
  396.                   child: Text(
  397.                     data['ime'],
  398.                     style: TextStyle(
  399.                         fontFamily: 'MadeEvolveSans', fontSize: 50, color: WHITE),
  400.                   ),
  401.                 ),
  402.               ),
  403.               Align(
  404.                 alignment: Alignment.topCenter,
  405.                 child: Text(
  406.                   data['volume'].toString() + "ml",
  407.                   style:
  408.                       TextStyle(fontFamily: 'MadeEvolveSans', fontSize: 25, color: WHITE),
  409.                 ),
  410.               ),
  411.             ],
  412.           ),
  413.           Align(
  414.             alignment: Alignment.bottomRight,
  415.             child: Padding(
  416.               padding: const EdgeInsets.only(bottom: 15.0, right: 17.0),
  417.               child: IconButton(
  418.                 onPressed: () {
  419.                   setState(() {
  420.                     if (selectedItems.containsKey(data['ime'])) {
  421.                       selectedItems.update(data['ime'], (dynamic val) => ++val);
  422.                     } else {
  423.                       selectedItems[data['ime']] = 1;
  424.                     }
  425.                     print(selectedItems);
  426.                   });
  427.                 },
  428.                 icon: Icon(
  429.                   Icons.add_circle,
  430.                   color: WHITE,
  431.                   size: iconSize,
  432.                 ),
  433.               ),
  434.             ),
  435.           ),
  436.           Align(
  437.             alignment: Alignment.bottomCenter,
  438.             child: Padding(
  439.               padding: const EdgeInsets.only(bottom: 0.0),
  440.               child: Text(
  441.                 (selectedItems[data['ime']] == 0 || selectedItems[data['ime']] == null)
  442.                     ? " "
  443.                     : selectedItems[data['ime']].toString(),
  444.                 style:
  445.                     TextStyle(fontFamily: 'MadeEvolveSans', fontSize: 60, color: WHITE),
  446.               ),
  447.             ),
  448.           ),
  449.           Align(
  450.             alignment: Alignment.bottomLeft,
  451.             child: Padding(
  452.               padding: const EdgeInsets.only(bottom: 15.0, left: 0.0),
  453.               child: IconButton(
  454.                 onPressed: () {
  455.                   setState(() {
  456.                     if (selectedItems.containsKey(data['ime'])) {
  457.                       selectedItems.update(data['ime'], (dynamic val) => --val);
  458.                       if (selectedItems[data['ime']] == 0) {
  459.                         selectedItems.remove(data['ime']);
  460.                       }
  461.                     }
  462.                     print(selectedItems);
  463.                   });
  464.                 },
  465.                 icon: Icon(
  466.                   Icons.do_not_disturb_on,
  467.                   color: WHITE,
  468.                   size: iconSize,
  469.                 ),
  470.               ),
  471.             ),
  472.           ),
  473.         ],
  474.       ),
  475.     );
  476.   }
  477.  
  478.   //!Builds LowerPart of the selection screen
  479.   Expanded buildBonusCounter(BuildContext context) => Expanded(
  480.         flex: 1,
  481.         child: Container(
  482.           color: Colors.transparent,
  483.           //height: MediaQuery.of(context).size.height * 0.1,
  484.           child: ListView.builder(
  485.             itemCount: selectedItems.length,
  486.             scrollDirection: Axis.horizontal,
  487.             itemBuilder: (context, index) {
  488.               return Column(
  489.                 crossAxisAlignment: CrossAxisAlignment.center,
  490.                 mainAxisAlignment: MainAxisAlignment.center,
  491.                 children: <Widget>[
  492.                   Container(
  493.                     height: MediaQuery.of(context).size.height * 0.1,
  494.                     width: MediaQuery.of(context).size.height * 0.1,
  495.                     decoration: BoxDecoration(
  496.                       color: Colors.transparent,
  497.                       shape: BoxShape.circle,
  498.                     ),
  499.                     child: new Stack(
  500.                       children: <Widget>[
  501.                         Center(
  502.                           child: new Image.asset(
  503.                             "assets/firstScreenYogurt.png",
  504.                             width: MediaQuery.of(context).size.height * 0.1 * 0.8,
  505.                             height: MediaQuery.of(context).size.height * 0.1 * 0.8,
  506.                           ),
  507.                         )
  508.                       ],
  509.                     ),
  510.                   ),
  511.                 ],
  512.               );
  513.             },
  514.           ),
  515.         ),
  516.       );
  517.  
  518.   //!Builds CartScreen
  519.   WillPopScope buildCartPage(bool onWillPop(), BuildContext context) => WillPopScope(
  520.         onWillPop: () => Future.sync(onWillPop),
  521.         child: Container(
  522.           color: WHITE,
  523.           child: Padding(
  524.             padding: const EdgeInsets.only(top: 30.0),
  525.             child: Stack(
  526.               children: <Widget>[
  527.                 Column(
  528.                   children: <Widget>[
  529.                     Padding(
  530.                       padding: const EdgeInsets.only(top: 20.0),
  531.                       child: Text(
  532.                         "Cart",
  533.                         style: TextStyle(fontSize: 35, fontFamily: 'MadeEvolveSans'),
  534.                       ),
  535.                     ),
  536.                     Padding(
  537.                       padding: EdgeInsets.only(top: 0),
  538.                       child: Container(
  539.                         color: Colors.transparent,
  540.                         height: 500,
  541.                         width: double.infinity,
  542.                         child: StreamBuilder(
  543.                             initialData: [],
  544.                             stream: userData,
  545.                             builder: (context, snap) {
  546.                               if (snap.connectionState == ConnectionState.waiting) {
  547.                                 return Center(
  548.                                   child: Text("Loading"),
  549.                                 );
  550.                               } else {
  551.                                 return ListView.builder(
  552.                                   itemBuilder: (context, int position) {
  553.                                     var list = selectedItems.keys.toList();
  554.                                     if (list.length == 0) {
  555.                                       return null;
  556.                                     } else {
  557.                                       return new OrderItem(
  558.                                         selectedItems: selectedItems,
  559.                                         ime_jogurta: list[position],
  560.                                         iconsMap: iconsMap,
  561.                                         slikeMap: slikeMap,
  562.                                       );
  563.                                     }
  564.                                   },
  565.                                   itemCount: selectedItems.length,
  566.                                 );
  567.                               }
  568.                             }),
  569.                       ),
  570.                     ),
  571.                   ],
  572.                 ),
  573.                 Padding(
  574.                   padding: const EdgeInsets.only(bottom: 8.0),
  575.                   child: Align(
  576.                     alignment: Alignment.bottomCenter,
  577.                     child: MaterialButton(
  578.                       onPressed: () {
  579.                         setState(() {
  580.                           selectedItems.clear();
  581.                         });
  582.                         showInSnackBar(
  583.                             "Your order has been dispatched. Thanks for ordering.");
  584.                       },
  585.                       height: 56,
  586.                       minWidth: MediaQuery.of(context).size.width / 1.2,
  587.                       color: THEME_COLOR,
  588.                       child: Text(
  589.                         "Confirm Order",
  590.                         style: TextStyle(color: WHITE),
  591.                       ),
  592.                       elevation: 2,
  593.                       highlightColor: THEME_COLOR,
  594.                       shape: OutlineInputBorder(
  595.                           borderRadius: BorderRadius.all(Radius.circular(30)),
  596.                           borderSide: BorderSide(color: THEME_COLOR)),
  597.                     ),
  598.                   ),
  599.                 ),
  600.               ],
  601.             ),
  602.           ),
  603.         ),
  604.       );
  605.  
  606.   void showInSnackBar(String value) {
  607.     //!Pokaži sporočilo po opravljenem naročilu
  608.     _scaffoldKey.currentState.showSnackBar(new SnackBar(content: new Text(value)));
  609.   }
  610.  
  611.   //!AssetImage assetImage(var n) => AssetImage(slikeMap[n]);   Icon Yogurt
  612.   AssetImage assetImage(var n) => AssetImage("assets/breskev.jpg");
  613. }
  614.  
  615. class ItemSlideshow extends StatefulWidget {
  616.   createState() => ItemSlideshowState();
  617. }
  618.  
  619. class ItemSlideshowState extends State<ItemSlideshow> {
  620.   final PageController ctrl = PageController(viewportFraction: 0.7);
  621.   final Firestore fireInstance = Firestore.instance;
  622.   Stream slides;
  623.   String activeTag = 'available';
  624.   int currentPage = 0;
  625.   Directory dir = Directory.systemTemp;
  626.   var myDir;
  627.   var slikeCached = {
  628.     'Breskev': '/data/user/0/com.example.yogurt/code_cache/marelica.jpg',
  629.     'Jagoda': '/data/user/0/com.example.yogurt/code_cache/jagoda.jpg',
  630.     'Vanilija Coko': '/data/user/0/com.example.yogurt/code_cache/vanilija_coko.jpg'
  631.   };
  632.  
  633.   @override
  634.   void initState() {
  635.     // TODO: implement initState
  636.     queryYogurts();
  637.     myDir = new Directory(dir.path);
  638.     ctrl.addListener(() {
  639.       int next = ctrl.page.round();
  640.       if (currentPage != next) {
  641.         setState(() {
  642.           currentPage = next;
  643.         });
  644.       }
  645.     });
  646.  
  647.     super.initState();
  648.   }
  649.  
  650.   @override
  651.   Widget build(BuildContext context) {
  652.     // TODO: implement build
  653.     return StreamBuilder(
  654.       stream: slides,
  655.       initialData: [],
  656.       builder: (context, AsyncSnapshot snap) {
  657.         List slideList = snap.data.toList();
  658.  
  659.         return PageView.builder(
  660.           controller: ctrl,
  661.           itemCount: slideList.length + 1,
  662.           itemBuilder: (context, int currentIdx) {
  663.             if (currentIdx == 0) {
  664.               return _buildTagPage();
  665.             } else if (slideList.length >= currentIdx) {
  666.               bool active = currentIdx == currentPage;
  667.               return _buildStoryPage(slideList[currentIdx - 1], active);
  668.             }
  669.           },
  670.         );
  671.       },
  672.     );
  673.   }
  674.  
  675.   Stream queryYogurts() {
  676.     //!Fetch items
  677.     try {
  678.       Query query =
  679.           fireInstance.collection('current_items').where("available", isEqualTo: true);
  680.       //!Filter available izdelke
  681.       //*QuerySnapshot contains zero or more QueryDocumentSnapshot objects representing the results of a query
  682.       slides = query.snapshots().map((list) {
  683.         //!Convert stream to map on the fly ->
  684.         return list.documents.map((doc) {
  685.           //*For every document
  686.           return doc.data; //*Data from every document
  687.         });
  688.       });
  689.     } catch (e) {
  690.       print("Got error: ${e.error}");
  691.     }
  692.   }
  693.  
  694.   _buildTagPage() {}
  695.  
  696.   _buildStoryPage(Map data, bool active) {
  697.     final double blur = active ? 30 : 0;
  698.     final double offset = active ? 15 : 5;
  699.     final double top = active ? 150 : 200;
  700.     final double iconSize = active ? 50 : 0;
  701.  
  702.     String ime = data['ime'];
  703.     String path = slikeCached[ime];
  704.  
  705.     return AnimatedContainer(
  706.       duration: Duration(milliseconds: 500),
  707.       curve: Curves.easeOutQuint,
  708.       margin: EdgeInsets.only(top: top, bottom: 50, right: 30),
  709.       decoration: BoxDecoration(
  710.           borderRadius: BorderRadius.circular(20),
  711.           image: DecorationImage(
  712.             fit: BoxFit.cover,
  713.             image: AssetImage('/data/user/0/com.example.yogurt/code_cache/marelica.jpg'),
  714.           ),
  715.           boxShadow: [
  716.             BoxShadow(
  717.                 color: THEME_COLOR, blurRadius: blur, offset: Offset(offset, offset))
  718.           ]),
  719.     );
  720.   }
  721. }
  722.  
  723. class SettingsIcon extends StatelessWidget {
  724.   const SettingsIcon({
  725.     Key key,
  726.     @required this.user,
  727.   }) : super(key: key);
  728.  
  729.   final FirebaseUser user;
  730.  
  731.   @override
  732.   Widget build(BuildContext context) {
  733.     return Stack(
  734.       alignment: Alignment.topRight,
  735.       children: <Widget>[
  736.         Padding(
  737.           padding: EdgeInsets.only(top: 2),
  738.         ),
  739.         InkWell(
  740.           onTap: () {
  741.             Navigator.push(
  742.                 context,
  743.                 MaterialPageRoute(
  744.                     //!Jump to settings
  745.                     builder: (context) => Settings(user)));
  746.           },
  747.           child: Icon(
  748.             Icons.settings_input_composite,
  749.             size: 35,
  750.           ),
  751.         ),
  752.       ],
  753.     );
  754.   }
  755. }
  756.  
  757. class OrdersIcon extends StatelessWidget {
  758.   final FirebaseUser user;
  759.   const OrdersIcon({Key key, @required this.user}) : super(key: key);
  760.  
  761.   @override
  762.   Widget build(BuildContext context) {
  763.     return Stack(
  764.       alignment: Alignment.topLeft,
  765.       children: <Widget>[
  766.         Padding(
  767.           padding: EdgeInsets.only(top: 2),
  768.         ),
  769.         InkWell(
  770.           onTap: () {
  771.             Navigator.push(
  772.                 context,
  773.                 MaterialPageRoute(
  774.                     //!Jump to past orders
  775.                     builder: (context) => Orders(user)));
  776.           },
  777.           child: Icon(
  778.             Icons.timer,
  779.             size: 35,
  780.           ),
  781.         ),
  782.       ],
  783.     );
  784.   }
  785. }
  786.  
  787. //!Metoda za printanje trenutnega števila izbranih izdelkov
  788. String showQuantity(ime_jogurta, Map selectedItems) {
  789.   if (selectedItems.containsKey(ime_jogurta)) {
  790.     return selectedItems[ime_jogurta].toString();
  791.   }
  792. }
  793.  
  794. //!Izdelek prikazan na CartScreen-u (Košarici)
  795. class OrderItem extends StatelessWidget {
  796.   final Map selectedItems;
  797.   final String ime_jogurta;
  798.   final Map iconsMap;
  799.   final Map slikeMap;
  800.  
  801.   const OrderItem(
  802.       {Key key,
  803.       @required this.selectedItems,
  804.       @required this.ime_jogurta,
  805.       @required this.iconsMap,
  806.       @required this.slikeMap})
  807.       : super(key: key);
  808.  
  809.   @override
  810.   Widget build(BuildContext context) {
  811.     return Padding(
  812.       padding: const EdgeInsets.only(bottom: 15.0, left: 15, right: 15),
  813.       child: Container(
  814.         decoration: new BoxDecoration(boxShadow: [
  815.           new BoxShadow(
  816.             color: Colors.black.withOpacity(0.2),
  817.             offset: new Offset(1.0, 2.0),
  818.             blurRadius: 5.0,
  819.           )
  820.         ], color: WHITE, borderRadius: new BorderRadius.all(Radius.circular(12))),
  821.         height: 110,
  822.         width: 100,
  823.         child: Padding(
  824.           padding: EdgeInsets.only(top: 15, left: 15, right: 15),
  825.           child: Stack(
  826.             children: <Widget>[
  827.               Align(
  828.                 alignment: Alignment.topLeft,
  829.                 child: Column(
  830.                   crossAxisAlignment: CrossAxisAlignment.start,
  831.                   children: <Widget>[
  832.                     Text(
  833.                       ime_jogurta,
  834.                       style: TextStyle(fontSize: 27),
  835.                     ),
  836.                     Text(
  837.                       (selectedItems[ime_jogurta] * 1.4).toStringAsFixed(2) + "€",
  838.                       style: TextStyle(fontSize: 20),
  839.                     ),
  840.                   ],
  841.                 ),
  842.               ),
  843.               Align(
  844.                 alignment: Alignment.topRight,
  845.                 child: new Image.asset(
  846.                   iconsMap[ime_jogurta],
  847.                   width: 110 * 0.6,
  848.                   height: 110 * 0.6,
  849.                 ),
  850.               ),
  851.               Align(
  852.                 alignment: Alignment.bottomCenter,
  853.                 child: MaterialButton(
  854.                   onPressed: () {
  855.                     //!_sendToServerLogin(myControllerLogin.text, myControllerPass.text);
  856.                   },
  857.                   height: 20,
  858.                   minWidth: 70,
  859.                   color: THEME_COLOR,
  860.                   child: Text(
  861.                     "Qty:  " + selectedItems[ime_jogurta].toString(),
  862.                     style: TextStyle(color: WHITE),
  863.                   ),
  864.                   elevation: 2,
  865.                   highlightColor: THEME_COLOR,
  866.                   shape: OutlineInputBorder(
  867.                       borderRadius: BorderRadius.all(Radius.circular(10)),
  868.                       borderSide: BorderSide(color: THEME_COLOR)),
  869.                 ),
  870.               ),
  871.             ],
  872.           ),
  873.         ),
  874.       ),
  875.     );
  876.   }
  877. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement