PDF Store & Retrive:


main.dart

import 'package:flutter/material.dart';

import 'package:pdf_app_store/PdfFirebase/FirstPage.dart';

void main() {

  runApp(MyApp());

}

class MyApp extends StatelessWidget {

  // This widget is the root of your application.

  @override

  Widget build(BuildContext context) {

    return MaterialApp(

      home: FirstPage(),

    );

  }

}

// to watch complete video check youtube channel (Easycoding with ammara)

model.dart

class Modal {
  String link, name;
  Modal(this.link, this.name);
}

firstpage.dart

import 'dart:convert';

import 'dart:io';

import 'dart:math';


import 'package:firebase_database/firebase_database.dart';

import 'package:flutter/material.dart';

import 'package:file_picker/file_picker.dart';

import 'package:firebase_storage/firebase_storage.dart';

import 'package:pdf_app_store/PdfFirebase/Modal.dart';

import 'package:pdf_app_store/PdfFirebase/SecondPage.dart';


class FirstPage extends StatefulWidget {

  @override

  _FirstPageState createState() => _FirstPageState();

}


class _FirstPageState extends State<FirstPage> {

  String names;

  TextEditingController name;


  List<Modal> itemList = List();


  final mainReference = FirebaseDatabase.instance.reference().child('Database');

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(

        backgroundColor: Colors.red,

        title: Text("Pdf With Firebase"),

        actions: [

          IconButton(

            icon: Icon(Icons.ac_unit),

            onPressed: () {},

          ),

        ],

      ),

      body: itemList.length == 0

          ? Text("Loading")

          : ListView.builder(

              itemCount: itemList.length,

              itemBuilder: (context, index) {

                return Padding(

                  padding: const EdgeInsets.fromLTRB(10, 0, 0, 0),

                  child: GestureDetector(

                    onTap: () {

                      String passData = itemList[index].link;

                      Navigator.push(

                        context,

                        MaterialPageRoute(

                          builder: (context) => ViewPdf(),

                          settings: RouteSettings(

                            arguments: passData,

                          ),

                        ),

                      );

                    },

                    child: Stack(

                      children: <Widget>[

                        Container(

                          height: 100,

                          decoration: BoxDecoration(

                            image: DecorationImage(

                              image: AssetImage('images/banner.jpg'),

                              fit: BoxFit.cover,

                            ),

                          ),

                        ),

                        Center(

                          child: Container(

                            height: 140,

                            child: Card(

                              margin: EdgeInsets.all(18),

                              elevation: 7.0,

                              child: Center(

                                child: Text(itemList[index].name +

                                    " " +

                                    (index + 1).toString()),

                              ),

                            ),

                          ),

                        ),

                      ],

                    ),

                  ),

                );

              },

            ),

      floatingActionButton: FloatingActionButton(

        onPressed: () {

          getPdfAndUpload();

        },

        child: Icon(

          Icons.add,

          color: Colors.white,

        ),

        backgroundColor: Colors.red,

      ),

    );

  }


  Future getPdfAndUpload() async {

    var rng = new Random();

    String randomName = "";

    for (var i = 0; i < 20; i++) {

      print(rng.nextInt(100));

      randomName += rng.nextInt(100).toString();

      //generate

    }

    File file = await FilePicker.getFile(type: FileType.custom);

    String fileName = '$randomName.pdf';

    savePdf(file.readAsBytesSync(), fileName);

    //function call

  }


  savePdf(List<int> asset, String name) async {

    StorageReference reference = FirebaseStorage.instance.ref().child(name);

    StorageUploadTask uploadTask = reference.putData(asset);

    String url = await (await uploadTask.onComplete).ref.getDownloadURL();

    documentFileUpload(url);

    //function call

  }


  // ignore: non_constant_identifier_names

  String CreateCryptoRandomString([int length = 20]) {

    final Random _random = Random.secure();

    var values = List<int>.generate(length, (i) => _random.nextInt(256));

    return base64Url.encode(values);

    //generate key

  }


  void documentFileUpload(String str) {

    var data = {

      "PDF": str,

      "FileName": name,

      //store data

    };

    mainReference.child(CreateCryptoRandomString()).set(data).then((v) {

      print("Store Successfully");

    });

  }


  @override

  // ignore: must_call_super

  void initState() {

    mainReference.once().then((DataSnapshot snap) {

      // print(snap);

      var data = snap.value;

      // print(data);

      itemList.clear();

      data.forEach((key, value) {

        Modal m = new Modal(value['PDF'], value['FileName']);

        itemList.add(m);

      });

      setState(() {

        // print("value is ");

        // print(itemList.length);

      });

      //get data from firebase

    });

  }

}


secondpage.dart

import 'package:flutter/material.dart';
import 'package:flutter_plugin_pdf_viewer/flutter_plugin_pdf_viewer.dart';
// import 'package:pdf_platform_view/pdf_platform_view.dart';

class ViewPdf extends StatefulWidget {
  @override
  _ViewPdfState createState() => _ViewPdfState();
}

class _ViewPdfState extends State<ViewPdf> {
  PDFDocument doc;
  @override
  Widget build(BuildContext context) {
    String data = ModalRoute.of(context).settings.arguments;
    //get data from first class
    // String data;
    ViewNow() async {
      doc = await PDFDocument.fromURL(data);
      setState(() {});
    }

    Widget Loading() {
      ViewNow();
      if (doc == null) {
        return Text("Loading");
        //return
      }
    }

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.red,
        title: Text("Retrieve Pdf"),
      ),
      body: doc == null ? Loading() : PDFViewer(document: doc),
    );
  }
}