riverpod_navigator_core 0.28.0 riverpod_navigator_core: ^0.28.0 copied to clipboard
Simple but powerfull Flutter navigation with riverpod, freezed and Navigator 2.0.
import 'dart:async';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_navigator_core/riverpod_navigator_core.dart';
class HomeSegment with TypedSegment {}
class BookSegment with TypedSegment {
BookSegment({required this.id});
final int id;
@override
JsonMap toJson() {
final res = super.toJson();
res['id'] = id;
return res;
}
}
class LoginSegment with TypedSegment {}
final loginProvider = StateProvider<bool>((_) => false);
class TestNavigator extends RNavigatorCore {
TestNavigator(Ref ref, {this.delayMsec, this.isError = false}) : super(ref, []);
final int? delayMsec;
final bool isError;
@override
FutureOr<TypedPath> appNavigationLogicCore(TypedPath oldNavigationStack, TypedPath ongoingPath) {
if (delayMsec == null) {
if (isError) throw 'SYNC ERROR';
return ongoingPath;
} else {
return Future.delayed(Duration(milliseconds: delayMsec!)).then<TypedPath>((value) {
if (isError) throw 'ASYNC ERROR';
return ongoingPath;
});
}
}
}
Future main() async {
final container = ProviderContainer(
overrides: RNavigatorCore.providerOverrides(
[HomeSegment()],
TestNavigator.new,
));
final navigator = container.read(navigatorProvider);
await container.pump();
await navigator.navigationCompleted;
final p1 = container.read(navigationStackProvider).toPath();
assert(p1 == '{"runtimeType":"HomeSegment"}');
container.read(ongoingPathProvider.notifier).state = [HomeSegment(), BookSegment(id: 1)];
await container.pump();
await navigator.navigationCompleted;
final p2 = container.read(navigationStackProvider).toPath();
assert(p2 == '{"runtimeType":"HomeSegment"}/{"runtimeType":"BookSegment","id":1}');
return;
}