Giter VIP home page Giter VIP logo

collection_walker's Introduction

Walk collections in firestore with ease

Features

  • Get the size of the collection / query
  • Get any document by index within a query

Usage

import 'package:collection_walker/collection_walker.dart';

class SomeScreen extends StatefulWidget {
  const SomeScreen({Key? key}) : super(key: key);

  @override
  State<SomeScreen> createState() => _SomeScreenState();
}

// The state should hold the walker
class _SomeScreenState extends State<SomeScreen> {
  late CollectionWalker<SomeData> _walker;

  @override
  void initState() {
    // Create the walker in initState
    _walker = CollectionWalker(
        chunkSize: 32, // Define a chunk size (usually 1.5x the number of items on screen)
        converter: (id, json) => SomeData.fromJson(json)..id = id, // Define a converter (see json_serializable)
        query: FirebaseFirestore.instance // Define a query
            .collection('some_collection')
            .orderBy('some_field'));
    // You do not need to dispose the walker as it only contains cached documents, when the state disposes
    // The objects cached will be disposed by GC
    super.initState();
  }

  @override
  Widget build(BuildContext context) => Scaffold(
    // Use a FutureBuilder to get the size of the collection so we can use a listview builder
    body: FutureBuilder<int>(
      future: _walker.getSize(), // Get the size future of the collection from the walker
      builder: (context, snap) => snap.hasData
          ? ListView.builder( // If we have the size, use a listview builder
        itemBuilder: (context, index) => FutureBuilder<SomeData?>(
          // Use a future builder to get the data at the index
          future: _walker.getAt(index),
          // Build it!
          builder: (context, snapshot) => snapshot.hasData
              ? Text(snapshot.data!.name)
              : const CircularProgressIndicator(),
        ),
      )
          : const Center(child: CircularProgressIndicator()),
    ),
  );
}

collection_walker's People

Contributors

cyberpwnn avatar

Watchers

 avatar Brian Fopiano avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.