network_resource 0.1.0

  • README.md
  • CHANGELOG.md
  • Example
  • Installing
  • Versions
  • 34

network_resource

Automatically cache network resources and use them when offline.

NetworkResource fetches data over HTTP, caches it in a file, and holds it in memory. The main method, get(), will return the value in memory, cache, or fetch from the network -- in that order. If the cache file is older than maxAge, the cache will be updated from the network if available. To manually refresh, use get(forceReload: true) or getFromNetwork(). The latter can be used to avoid cache fallback.

Examples

There are three concrete classes included.

  • StringNetworkResource
  • StringListNetworkResource
  • BinaryNetworkResource
// String data.
final eventsResource = StringNetworkResource(
  url: 'https://example.com/events.json',
  filename: 'events.json',
  maxAge: Duration(minutes: 60),
);

// Binary data.
final photo = BinaryNetworkResource(
  url: 'https://example.com/photo.png',
  filename: 'photo.png',
  maxAge: Duration(hours: 24),
);

// A string list, line by line.
 final words = StringListNetworkResource(
  url: 'https://example.com/wordlist.txt',
  filename: 'wordlist.txt',
  maxAge: Duration(hours: 24),
);

// Parsing a JSON string into a `List<Event>`.
json.decode(data).forEach((item) => events.add(Event(item)));

Extend

Instead of declaring the resource and parsing its data separately, extend the base class and implement parseContents(contents) where either a String or List<int> will be passed, depending on the value of isBinary.

// This example subclasses `NetworkResource` to manage fetching and parsing
// an event list in JSON format. Items are shown in a list with pull-to-refresh.

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:network_resource/network_resource.dart';

class Event {
  final String title;
  Event(this.title);
}

class EventListResource extends NetworkResource<List<Event>> {
  EventListResource()
      : super(
            url: 'http://example.com/events.json',
            filename: 'events.json',
            maxAge: Duration(minutes: 60),
            isBinary: false);
  @override
  List<Event> parseContents(contents) {
    List events;
    json.decode(contents).forEach((item) => events.add(Event(item)));
    return events;
  }
}

final eventsResource = EventListResource();

class _EventListState extends State<EventList> {
  Future<Null> refresh() async {
    await eventsResource.get(forceReload: true);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: RefreshIndicator(
            onRefresh: refresh,
            child: ListView.builder(
                itemBuilder: (context, index) =>
                    Text(eventsResource.data[index].title))));
  }
}

class EventList extends StatefulWidget {
  @override
  _EventListState createState() => _EventListState();
}

void main() => runApp(MaterialApp(
    title: 'Network Resource example',
    home: FutureBuilder<List<Event>>(
      future: eventsResource.get(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return EventList();
        } else if (snapshot.hasError) {
          return Text('${snapshot.error}');
        }
        return Center(child: CircularProgressIndicator());
      },
    )));

[0.1.0] - July 15, 2018

  • Make NetworkResource easily extendable so that it can be adapted to any data type.

[0.0.4] - July 15, 2018

  • Return data without waiting for cache write to finish.
  • Many documentation improvements.

[0.0.3] - June 13, 2018

  • Breaking: NetworkResource is now abstract. You must use StringNetworkResource, StringListNetworkResource, BinaryNetworkResource, or extend and create your own.

[0.0.2] - June 13, 2018

  • Added example usage.

[0.0.1] - June 13, 2018

  • First release.

example/main.dart

// This example subclasses `NetworkResource` to manage fetching and parsing
// an event list in JSON format. Items are shown in a list with pull-to-refresh.

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import '../lib/network_resource.dart';

class Event {
  final String title;
  Event(this.title);
}

class EventListResource extends NetworkResource<List<Event>> {
  EventListResource()
      : super(
            url: 'http://example.com/events.json',
            filename: 'events.json',
            maxAge: Duration(minutes: 60),
            isBinary: false);
  @override
  List<Event> parseContents(contents) {
    List events;
    json.decode(contents).forEach((item) => events.add(Event(item)));
    return events;
  }
}

final eventsResource = EventListResource();


class _EventListState extends State<EventList> {
  Future<Null> refresh() async {
    await eventsResource.get(forceReload: true);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: RefreshIndicator(
            onRefresh: refresh,
            child: ListView.builder(
                itemBuilder: (context, index) =>
                    Text(eventsResource.data[index].title))));
  }
}

class EventList extends StatefulWidget {
  @override
  _EventListState createState() => _EventListState();
}

void main() => runApp(MaterialApp(
    title: 'Network Resource example',
    home: FutureBuilder<List<Event>>(
      future: eventsResource.get(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return EventList();
        } else if (snapshot.hasError) {
          return Text('${snapshot.error}');
        }
        return Center(child: CircularProgressIndicator());
      },
    )));

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  network_resource: ^0.1.0

2. Install it

You can install packages from the command line:

with pub:


$ pub get

Alternatively, your editor might support pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:network_resource/network_resource.dart';
  
Version Uploaded Documentation Archive
0.2.4 Jul 21, 2018 Go to the documentation of network_resource 0.2.4 Download network_resource 0.2.4 archive
0.2.3 Jul 21, 2018 Go to the documentation of network_resource 0.2.3 Download network_resource 0.2.3 archive
0.2.2 Jul 21, 2018 Go to the documentation of network_resource 0.2.2 Download network_resource 0.2.2 archive
0.2.1 Jul 21, 2018 Go to the documentation of network_resource 0.2.1 Download network_resource 0.2.1 archive
0.2.0 Jul 20, 2018 Go to the documentation of network_resource 0.2.0 Download network_resource 0.2.0 archive
0.1.0 Jul 15, 2018 Go to the documentation of network_resource 0.1.0 Download network_resource 0.1.0 archive
0.0.4 Jul 15, 2018 Go to the documentation of network_resource 0.0.4 Download network_resource 0.0.4 archive
0.0.3 Jun 20, 2018 Go to the documentation of network_resource 0.0.3 Download network_resource 0.0.3 archive
0.0.2 Jun 14, 2018 Go to the documentation of network_resource 0.0.2 Download network_resource 0.0.2 archive
0.0.1 Jun 14, 2018 Go to the documentation of network_resource 0.0.1 Download network_resource 0.0.1 archive
Popularity:
Describes how popular the package is relative to other packages. [more]
68
Health:
Code health derived from static analysis. [more]
0
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
0
Overall:
Weighted score of the above. [more]
34
Learn more about scoring.

The package version is not analyzed, because it does not support Dart 2. Until this is resolved, the package will receive a health and maintenance score of 0.

Issues and suggestions

Support Dart 2 in pubspec.yaml.

The SDK constraint in pubspec.yaml doesn't allow the Dart 2.0.0 release. For information about upgrading it to be Dart 2 compatible, please see https://www.dartlang.org/dart-2#migration.

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=1.19.0 <2.0.0