Advertisement
malkasun

bookmanager

May 1st, 2020
647
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 9.50 KB | None | 0 0
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:matcher/matcher.dart';
  4. import 'package:cloud_firestore/cloud_firestore.dart';
  5.  
  6. import './models/book.dart';
  7.  
  8. void main() => runApp(BookApp());
  9.  
  10. class BookApp extends StatelessWidget {
  11.   @override
  12.   Widget build(BuildContext context) {
  13.     return MaterialApp(
  14.       debugShowCheckedModeBanner: false,
  15.       title: 'books manager',
  16.       home: BookFirebaseDemo(),
  17.     );
  18.   }
  19. }
  20.  
  21. class BookFirebaseDemo extends StatefulWidget {
  22. //  ======CREATE A CONSTRUCTOR OF BOOKFIREBASEDEMO=========
  23.   BookFirebaseDemo() : super();
  24.  
  25. //  ======ADD A TITLE TO DB==========(1)======
  26.   final String appTitle = "Book DB";
  27.  
  28.   @override
  29.   _BookFirebaseDemoState createState() => _BookFirebaseDemoState();
  30. }
  31.  
  32. class _BookFirebaseDemoState extends State<BookFirebaseDemo> {
  33. //  ===========CREATE 2 TEXTEDITING CONTROLLER==========
  34.   TextEditingController _bookNameControler = TextEditingController();
  35.   TextEditingController _bookAuthoControler = TextEditingController();
  36.  
  37. //  ===========ADD BOOL VARIABLES=======
  38.   bool isEditing = false;
  39.   bool textFieldVisibility = false;
  40.  
  41. //  =======ADD A COLLECTION NAME , (MATCH TO FIREBASE DB COLLECTION NAME)==============
  42.   String firestoreCollectionName = "Books";
  43.  
  44. //  =================CREATE A OBJECT FROM BOOK CLASS (BOOK.DART)================
  45.   Book currentBook;
  46.  
  47. //  ===========CREATE A GETALLBOOKS METHOD (GET ALL DATA FROM BOOK CLASS)===========
  48.   getAllBooks() {
  49.     return Firestore.instance.collection(firestoreCollectionName).snapshots();
  50.   }
  51.  
  52. // =======CREATE A METHOD HOW TO ADD DATA TO DOCUMENT==============
  53.   addBook() async {
  54.     Book book = Book(
  55.         bookName: _bookNameControler.text,
  56.         authoName: _bookAuthoControler.text);
  57.  
  58. //    ==========CREATE TRY CATCH==========
  59.     try {
  60.       Firestore.instance.runTransaction((Transaction transaction) async {
  61.         await Firestore.instance
  62.             .collection(firestoreCollectionName)
  63.             .document()
  64.             .setData(book.toJason());
  65.       });
  66.     } catch (e) {
  67.       print(e.toString());
  68.     }
  69.   }
  70.  
  71. //  =======CREATE UPDATE BOOK METHOD (CREATE 3 OBJECTS>> BOOK, BOOKNAME, AUTHORNAME)==========
  72.   updateBook(Book book, String bookName, String authoName) {
  73.     try {
  74.       Firestore.instance.runTransaction((transaction) async {
  75.         await transaction.update(book.documentReference,
  76.             {'bookName': bookName, 'authoName': authoName});
  77.       });
  78.     } catch (e) {
  79.       print(e.toString());
  80.     }
  81.   }
  82.  
  83. //  ========IF CHECK UPDATION, "YES" >> ACTIVATE UPDATE BUTTON & RUN BOOKUPDATE METHOD========
  84. //  =========USE isEditing BOOL VALUE=========
  85.   updateIfEditing() {
  86.     if (isEditing) {
  87. //  ========update========
  88.       updateBook(
  89.           currentBook, _bookNameControler.text, _bookAuthoControler.text);
  90. //      =======AFTER EDIT , RESET THE BOOL VALUE========
  91.       setState(() {
  92.         isEditing = false;
  93.       });
  94.     }
  95.   }
  96.  
  97. //  ===========DELETE BOOK FUNCTION============
  98.   deleteBook(Book book) {
  99.     Firestore.instance.runTransaction((Transaction transaction) async {
  100.       await transaction.delete(book.documentReference);
  101.     });
  102.   }
  103.  
  104. //  ===========C R E A T E  F R O N T  E N D==============
  105. //  =======CREATE A WIDGET ===========
  106.  
  107.   Widget buildBody(BuildContext context){
  108.  
  109.     return StreamBuilder<QuerySnapshot>(
  110.       stream: getAllBooks(),
  111.  
  112.       builder: (context, snapshot) {
  113.         if (snapshot.hasError) {
  114.           return Text("Error ${snapshot.error}");
  115.         }
  116.         if (snapshot.hasData) {
  117.           print("Documents -> ${snapshot.data.documents.length}");
  118.           return buildList(context, snapshot.data.documents);
  119.         }if(!snapshot.hasData || snapshot.data == null) return addBook();
  120.  
  121.         return CircularProgressIndicator();
  122.       },
  123.  
  124.         );
  125.  
  126.  
  127.     }
  128.  
  129.  
  130.  
  131.  
  132. //  ===============CREATE A BUILD LIST WIDGET==================
  133. //  ============& CREATE BUILDLIST WIDGET============================
  134.   Widget buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
  135.     return ListView(
  136.         children:
  137.             snapshot.map((data) => listItemBuild(context, data)).toList(),);
  138.   }
  139.  
  140. //  ============CREATE LISTITEMBUILD WIDGET============
  141.   Widget listItemBuild(BuildContext context, DocumentSnapshot data) {
  142.     final book = Book.fromSnapshot(data);
  143.     return Padding(
  144.       key: ValueKey(book.bookName),
  145.       padding: EdgeInsets.symmetric(vertical: 19.0, horizontal: 2.0),
  146.       child: Container(
  147.         decoration: BoxDecoration(
  148.           border: Border.all(color: Colors.redAccent),
  149.           borderRadius: BorderRadius.circular(5.0),
  150.         ),
  151.         child: SingleChildScrollView(
  152.           child: ListTile(
  153.             title: Column(
  154.               children: <Widget>[
  155.                 Row(
  156.                   children: <Widget>[
  157.                     Icon(
  158.                       Icons.book,
  159.                       color: Colors.green,
  160.                     ),
  161.                     Text(book.bookName),
  162.                   ],
  163.                 ),
  164.                 Divider(),
  165.                 Row(
  166.                   children: <Widget>[
  167.                     Icon(
  168.                       Icons.person,
  169.                       color: Colors.green,
  170.                     ),
  171.                     Text(book.authoName),
  172.                   ],
  173.                 ),
  174.               ],
  175.             ),
  176.             trailing: IconButton(
  177.               icon: Icon(
  178.                 Icons.delete,
  179.                 color: Colors.red,
  180.               ),
  181.               onPressed: () {
  182.                 deleteBook(book);
  183.               },
  184.             ),
  185. //            ==========TAP ON THE BOOK DETAIL >>GOES TO UPDATE==========
  186.             onTap: () {
  187.               setUpdateUI(book);
  188.             },
  189.           ),
  190.         ),
  191.       ),
  192.     );
  193.   }
  194.  
  195. //  =============CREATE SETUPDATEUI>>> TAP THE TILE AFTER SET THE UPDATE BOOK DETAILS==========
  196.   setUpdateUI(Book book) {
  197.     _bookNameControler.text = book.bookName;
  198.     _bookAuthoControler.text = book.authoName;
  199.  
  200.     setState(() {
  201.       textFieldVisibility = true;
  202.       isEditing = true;
  203.       currentBook = book;
  204.     });
  205.   }
  206.  
  207. //  ==========CREATE ADD/UPDATE BUTTON AS METHOD============
  208. //  ===========TAP THE TILE, RUN SETUPDATEUI, ADD BUTTON CHANGE TO UPDATE=======
  209.   button() {
  210.     return SizedBox(
  211.       width: double.infinity,
  212.       child: OutlineButton(
  213.         child: Text(isEditing ? "UPDATE" : "ADD"),
  214.         onPressed: () {
  215.           if (isEditing == true) {
  216.             updateIfEditing();
  217.           } else {
  218.             addBook();
  219.           }
  220.           setState(() {
  221.             textFieldVisibility = false;
  222.           });
  223.         },
  224.       ),
  225.     );
  226.   }
  227.  
  228.   @override
  229.   Widget build(BuildContext context) {
  230.     return SafeArea(
  231.       child: Scaffold(
  232. //          ==========STOP RENDER CRASHING FROM KEYBOARD==========
  233.         resizeToAvoidBottomPadding: false,
  234.         appBar: AppBar(
  235. //            ===========USE APPTITLE VARIABLE=========(1)========
  236.           title: Text(widget.appTitle),
  237.           actions: <Widget>[
  238.             IconButton(
  239.                 icon: Icon(Icons.add),
  240.                 onPressed: () {
  241.                   setState(() {
  242.                     textFieldVisibility = !textFieldVisibility;
  243.                   });
  244.                 }),
  245.           ],
  246.         ),
  247.         body: Container(
  248.           padding: EdgeInsets.all(15.0),
  249.           child: Column(
  250.             crossAxisAlignment: CrossAxisAlignment.center,
  251.             mainAxisAlignment: MainAxisAlignment.start,
  252.             children: <Widget>[
  253.               textFieldVisibility
  254.                   ? Column(
  255.                       crossAxisAlignment: CrossAxisAlignment.center,
  256.                       mainAxisAlignment: MainAxisAlignment.start,
  257.                       children: <Widget>[
  258.                         Column(
  259.                           children: <Widget>[
  260.                             TextFormField(
  261.                               controller: _bookNameControler,
  262.                               decoration: InputDecoration(
  263.                                 labelText: "Book Name",
  264.                                 hintText: "Enter Book Name",
  265.                               ),
  266.                             ),
  267.                           ],
  268.                         ),
  269.                         Column(
  270.                           children: <Widget>[
  271.                             TextFormField(
  272.                               controller: _bookAuthoControler,
  273.                               decoration: InputDecoration(
  274.                                 labelText: "Book Author",
  275.                                 hintText: "Enter Author Name",
  276.                               ),
  277.                             ),
  278.                           ],
  279.                         ),
  280.                         SizedBox(
  281.                           height: 10.0,
  282.                         ),
  283.                         button()
  284.                       ],
  285.                     )
  286.                   : Container(),
  287.               SizedBox(
  288.                 height: 20.0,
  289.               ),
  290.              
  291.               Text(
  292.                 "BOOKS",
  293.                 style: TextStyle(
  294.                   fontSize: 18.0,
  295.                   fontWeight: FontWeight.w800,
  296.                 ),
  297.               ),
  298.               SizedBox(
  299.                 height: 20.0,
  300.               ),
  301.               Flexible(
  302.                 child: buildBody(context),
  303.               ),
  304.             ],
  305.           ),
  306.         ),
  307.       ),
  308.     );
  309.   }
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement