Overview
This is the liniting package for state_beacon. It provides a set of lint rules to help you write better code and avoid some of its pitfalls.
Installation
dart pub add custom_lint state_beacon_lint --dev
# or add these lines to your pubspec.yaml
dev_dependencies:
custom_lint:
state_beacon_lint:
Enable the custom_lint
plugin in your analysis_options.yaml
file by adding the following.
analyzer:
plugins:
- custom_lint
NB: Create the file if it doesn't exist.
Pitfalls of state_beacon
When using Beacon.derivedFuture
, only beacons accessed before the async gap(await
) will be tracked as dependencies.
final counter = Beacon.writable(0);
final doubledCounter = Beacon.derived(() => counter.value * 2);
final derivedFutureCounter = Beacon.derivedFuture(() async {
// This will be tracked as a dependency because it's accessed before the async gap
final count = counter.value;
await Future.delayed(Duration(seconds: count));
// This will NOT be tracked as a dependency because it's accessed after `await`
final doubled = doubledCounter.value;
return '$count x 2 = $doubled';
});
When a derivedFuture depends on multiple future/stream beacons
- DONT:
final derivedFutureCounter = Beacon.derivedFuture(() async {
// in this instance lastNameStreamBeacon will not be tracked as a dependency
// because it's accessed after the async gap
final firstName = await firstNameFutureBeacon.toFuture();
final lastName = await lastNameStreamBeacon.toFuture();
return 'Fullname is $firstName $lastName';
});
- DO:
final derivedFutureCounter = Beacon.derivedFuture(() async {
// acquire the futures before the async gap ie: don't use await
final firstNameFuture = firstNameFutureBeacon.toFuture();
final lastNameFuture = lastNameStreamBeacon.toFuture();
// wait for the futures to complete
final (String firstName, String lastName) = await (firstNameFuture, lastNameFuture).wait;
return 'Fullname is $firstName $lastName';
});