Add flutter_data and dependencies to your pubspec.yaml file:
dependencies:
flutter:
sdk: flutter
flutter_data: ^1.5.6
# Highly RECOMMENDED (but not required) packages
path_provider: ^2.0.11
json_annotation: ^4.7.0
hooks_riverpod: ^2.1.1
dev_dependencies:
build_runner: ^2.2.0 # REQUIRED!
# Highly RECOMMENDED (but not required) packages
json_serializable: ^6.4.1
Flutter Data doesn’t require any library besides build_runner for code generation.
However, json_serializable and path_provider are very convenient so they are recommended.
flutter_data should be 1.5.6. Please check for all packages latest stable versions before copy-pasting dependencies.This package is developed for Riverpod, specifically Riverpod 2.x Hooks. Other libraries such as Provider or GetIt might work but there are no guarantees.
Make your models extend DataModel<T>, override id and annotate them with @DataRepository().
import 'package:flutter_data/flutter_data.dart';
import 'package:json_annotation/json_annotation.dart';
part 'task.g.dart';
@JsonSerializable()
@DataRepository([])
class Task extends DataModel<Task> {
@override
final int? id;
final String title;
final bool completed;
Task({this.id, required this.title, this.completed = false});
}
@DataRepository() takes a list of adapters.
Adapters are Dart mixins used to customize the framework’s behavior, ranging from the very basic to the extremely powerful. They are applied on Flutter Data’s RemoteAdapter<T> base class.
Let’s start by the most typical configuration to access a remote API, the base URL.
mixin JsonServerAdapter<T extends DataModel<T>> on RemoteAdapter<T> {
@override
String get baseUrl => 'https://my-json-server.typicode.com/flutterdata/demo/';
}
Next, we’ll pass it to the annotation:
@JsonSerializable()
@DataRepository([JsonServerAdapter])
class Task extends DataModel<Task> {
final int? id;
final String title;
final bool completed;
Task({this.id, required this.title, this.completed = false});
}
Notice two things about our model above:
int? to represent the actual type of the id identifier field as it is null when new (it could have been a String too)fromJson and toJson functions were skipped as they are not required (Flutter Data will automatically use _$TaskFromJson and _$TaskToJson generated by json_serializable – but they can both be overridden)Flutter Data ships with a built-in serializer/deserializer for classic JSON.
A Task instance in JSON would look like:
{
"id": 1,
"title": "Finish this documentation for once",
"completed": false,
"userId": 1
}
We are now ready to run a build:
flutter pub run build_runner build
Flutter Data auto-generated a Repository class for Task.
It also generated a Dart library at main.data.dart which makes Flutter Data initialization effortless. It’s out-of-the-box compatible with Riverpod.
Next step is to configure local storage and initialize the framework:
import 'package:flutter/material.dart';
import 'package:flutter_data/flutter_data.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:tutorial/main.data.dart';
void main() {
runApp(
ProviderScope(
child: TasksApp(),
overrides: [configureRepositoryLocalStorage()],
),
);
}
class TasksApp extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return MaterialApp(
home: Scaffold(
body: Center(
child: ref.watch(repositoryInitializerProvider).when(
error: (error, _) => Text(error.toString()),
loading: () => const CircularProgressIndicator(),
data: (_) => Text('Hello from Flutter Data ${ref.tasks}!'),
),
),
),
debugShowCheckedModeBanner: false,
);
}
}
Once the data callback is invoked, Flutter Data is ready and the Task repository can be accessed via ref.tasks!
The configureRepositoryLocalStorage setup function has several optional arguments.
If you do not have path_provider as a dependency you will have to supply baseDirFn (a function that returns a base directory for local storage).
For more information see initialization.
Prefer a setup example? Here’s the sample setup app with support for Riverpod, Provider and get_it.
âž¡ Continue with the tutorial for a Tasks app or learn more about Repositories