datacontext 2.0.2
datacontext: ^2.0.2 copied to clipboard
A library that makes API fetching more natural and more readable
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));
}