datacontext 2.0.2 copy "datacontext: ^2.0.2" to clipboard
datacontext: ^2.0.2 copied to clipboard

A library that makes API fetching more natural and more readable

example/lib/main.dart

import 'dart:convert';
import 'package:datacontext/datacontext.dart';
import 'package:flutter/material.dart';
import 'package:http/src/response.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
      ChangeNotifierProvider(create: (context) => MyContext(), child: MyApp()));
}

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

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final DataSet<Restaurant> restaurants = DataSet.of<Restaurant>();

  @override
  void initState() {
    super.initState();
    restaurants.get();
  }

  void loadFoods(String restaurantId) {
    restaurants.child<Food>(parentId: restaurantId).get();
  }

  @override
  Widget build(BuildContext context) {
    return LoadStatusWidget(
      status: restaurants.loadStatus,
      loadWidget: (context) {
        return ListView(
          children: restaurants.list.map((restaurant) {
            return TextButton(
                child: Text(restaurant.name ?? 'No name'),
                onPressed: () => loadFoods(restaurant.id ?? ''));
          }).toList(),
        );
      },
    );
  }
}

class MyContext extends DataContext {
  MyContext() : super('https://localhost/api');

  @override
  void onReceiveData(Response response) {
    print(
        'RESULT: ${response.statusCode} - REQUEST: ${response.request!.url.toString()}');
  }

  @override
  void onSendData(APIRequest request) {
    print(request.headers['Authorization']);
  }

  DataSet<Restaurant> restaurants = DataSet<Restaurant>(
          route: '/restaurants',
          idFieldGetter: (r) => r.id,
          instanceBuilder: () => Restaurant())
      .withChild(DataSet<Food>(
          route: '/restaurants/:parentId/foods',
          idFieldGetter: (f) => f.id,
          instanceBuilder: () => Food()));
}

class Food extends DataClass {
  String? id;
  String? name;
  double? price;

  Food({this.id, this.name, this.price});

  @override
  Map<String, dynamic> toMap() => {'id': id, 'name': name, 'price': price};
  @override
  Food fromMap(Map<String, dynamic> map) => Food.fromMap(map);
  @override
  String toJson() => json.encode(toMap());

  factory Food.fromMap(Map<String, dynamic> map) =>
      Food(id: map['id'], name: map['name'], price: map['price']);
  factory Food.fromJson(String source) => Food.fromMap(json.decode(source));
}

class Restaurant extends DataClass {
  String? id;
  String? name;

  Restaurant({this.id, this.name});

  @override
  Map<String, dynamic> toMap() => {'id': id, 'name': name};
  @override
  Restaurant fromMap(Map<String, dynamic> map) => Restaurant.fromMap(map);
  @override
  String toJson() => json.encode(toMap());

  factory Restaurant.fromMap(Map<String, dynamic> map) =>
      Restaurant(id: map['id'], name: map['name']);
  factory Restaurant.fromJson(String source) =>
      Restaurant.fromMap(json.decode(source));
}
5
likes
130
points
75
downloads

Publisher

unverified uploader

Weekly Downloads

A library that makes API fetching more natural and more readable

Repository (GitHub)
View/report issues

Documentation

API reference

License

GPL-3.0 (license)

Dependencies

flutter, http, provider

More

Packages that depend on datacontext