Resources
Resources are special Signals designed specifically to handle Async loading. Their purpose is wrap async values in a way that makes them easy to interact with handling the common states of a future data, error and loading.
Resources can be driven by a source signal that provides the query to an async data fetcher function that returns a Future.
The contents of the fetcher function can be anything. You can hit typical REST endpoints or GraphQL or anything that generates a future. Resources are not opinionated on the means of loading the data, only that they are driven by futures.
Let's create a Resource:
// Using http as a client
import 'package:http/http.dart' as http;
// The source
final userId = Signal(1);
// The fetcher
Future<String> fetchUser() async {
final response = await http.get(
Uri.parse('https://swapi.dev/api/people/${userId.value}/'),
);
return response.body;
}
// The resource (source is optional)
final user = Resource(fetchUser, source: userId);
A Resource can also be driven from a [stream] instead of a Future.
In this case you just need to pass the stream field to the Resource class.
The resource has a value named ResourceState, that provides many useful convenience methods to correctly handle the state of the resource.
The on method forces you to handle all the states of a Resource (ready, error and loading).
The are also other convenience methods to handle only specific states:
onforces you to handle all the states of a ResourcemaybeOnlets you decide which states to handle and provide anorElseaction for unhandled statesmapequal toonbut gives access to theResourceStatedata classmaybeMapequal tomaybeOnbut gives access to theResourceStatedata classisReadyindicates if theResourceis in the ready stateisLoadingindicates if theResourceis in the loading statehasErrorindicates if theResourceis in the error stateasReadyupcastResourceStateinto aResourceReady, or return null if theResourceStateis in loading/error stateasErrorupcastResourceStateinto aResourceError, or return null if theResourceStateis in loading/ready statevalueattempts to synchronously get the value ofResourceReadyerrorattempts to synchronously get the error ofResourceError
A Resource provides the fetch and refresh methods.
The refresh method forces an update and calls the fetcher function again or subscribes again to the stream.