feat(useragent): settled on routing architecture
This commit is contained in:
@@ -37,6 +37,18 @@
|
|||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.4"
|
"languageVersion": "3.4"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "auto_route",
|
||||||
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/auto_route-11.1.0",
|
||||||
|
"packageUri": "lib/",
|
||||||
|
"languageVersion": "3.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "auto_route_generator",
|
||||||
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/auto_route_generator-10.4.0",
|
||||||
|
"packageUri": "lib/",
|
||||||
|
"languageVersion": "3.4"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "biometric_signature",
|
"name": "biometric_signature",
|
||||||
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/biometric_signature-10.2.0",
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/biometric_signature-10.2.0",
|
||||||
@@ -213,7 +225,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "flutter_adaptive_scaffold",
|
"name": "flutter_adaptive_scaffold",
|
||||||
"rootUri": "file:///Users/kaska/.pub-cache/git/flutter_adaptive_scaffold-4852b5041d8d9ed6cacb4dc4c6723086f0612e37/",
|
"rootUri": "file:///Users/kaska/.pub-cache/git/flutter_adaptive_scaffold-b2e3615901a7ab837cb7fc35efbfcf8b55f27638/",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.10"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
@@ -355,6 +367,12 @@
|
|||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.7"
|
"languageVersion": "3.7"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "hotreloader",
|
||||||
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/hotreloader-4.3.0",
|
||||||
|
"packageUri": "lib/",
|
||||||
|
"languageVersion": "3.0"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "http",
|
"name": "http",
|
||||||
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/http-1.6.0",
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/http-1.6.0",
|
||||||
@@ -415,6 +433,12 @@
|
|||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.2"
|
"languageVersion": "3.2"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "lean_builder",
|
||||||
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/lean_builder-0.1.6",
|
||||||
|
"packageUri": "lib/",
|
||||||
|
"languageVersion": "3.8"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "lints",
|
"name": "lints",
|
||||||
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/lints-6.1.0",
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/lints-6.1.0",
|
||||||
@@ -813,9 +837,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "watcher",
|
"name": "watcher",
|
||||||
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/watcher-1.2.1",
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/watcher-1.1.4",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.4"
|
"languageVersion": "3.1"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "web",
|
"name": "web",
|
||||||
@@ -853,6 +877,12 @@
|
|||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.3"
|
"languageVersion": "3.3"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "xxh3",
|
||||||
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/xxh3-1.2.0",
|
||||||
|
"packageUri": "lib/",
|
||||||
|
"languageVersion": "2.16"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "yaml",
|
"name": "yaml",
|
||||||
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/yaml-3.1.3",
|
"rootUri": "file:///Users/kaska/.pub-cache/hosted/pub.dev/yaml-3.1.3",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,118 +0,0 @@
|
|||||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
||||||
import 'package:sizer/sizer.dart';
|
|
||||||
|
|
||||||
const transitionDuration = Duration(milliseconds: 800);
|
|
||||||
|
|
||||||
class AdaptiveBuilders {
|
|
||||||
WidgetBuilder? buildSmall;
|
|
||||||
WidgetBuilder? buildMediumLarge;
|
|
||||||
WidgetBuilder? buildLarge;
|
|
||||||
WidgetBuilder? buildExtraLarge;
|
|
||||||
WidgetBuilder? build;
|
|
||||||
|
|
||||||
AdaptiveBuilders({
|
|
||||||
this.buildSmall,
|
|
||||||
this.buildMediumLarge,
|
|
||||||
this.buildLarge,
|
|
||||||
this.buildExtraLarge,
|
|
||||||
this.build,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class Destination {
|
|
||||||
final String label;
|
|
||||||
final String? tooltip;
|
|
||||||
final Icon icon;
|
|
||||||
final Icon? selectedIcon;
|
|
||||||
|
|
||||||
final AdaptiveBuilders main;
|
|
||||||
final AdaptiveBuilders? secondary;
|
|
||||||
|
|
||||||
Destination({
|
|
||||||
required this.label,
|
|
||||||
required this.icon,
|
|
||||||
this.selectedIcon,
|
|
||||||
required this.main,
|
|
||||||
this.secondary,
|
|
||||||
this.tooltip,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class Switcher extends StatelessWidget {
|
|
||||||
final Widget? child;
|
|
||||||
|
|
||||||
const Switcher({super.key, this.child});
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return AnimatedSwitcher(
|
|
||||||
duration: Duration(
|
|
||||||
milliseconds: transitionDuration.inMilliseconds ~/ 100,
|
|
||||||
),
|
|
||||||
transitionBuilder: (child, animation) {
|
|
||||||
return FadeTransition(opacity: animation, child: child);
|
|
||||||
},
|
|
||||||
child: child,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WidgetBuilder? patchAnimated(WidgetBuilder? input) {
|
|
||||||
if (input == null) return null;
|
|
||||||
return (context) => Switcher(child: input(context));
|
|
||||||
}
|
|
||||||
|
|
||||||
class HomeRouter extends HookWidget {
|
|
||||||
final List<Destination> destinations;
|
|
||||||
|
|
||||||
HomeRouter({super.key, required this.destinations})
|
|
||||||
: assert(destinations.isNotEmpty);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final selectedIndex = useState(0);
|
|
||||||
final destination = useMemoized(() => destinations[selectedIndex.value], [
|
|
||||||
selectedIndex.value,
|
|
||||||
]);
|
|
||||||
final dispatcher = useMemoized(() => destination.main, [
|
|
||||||
selectedIndex.value,
|
|
||||||
]);
|
|
||||||
final secondaryDispatcher = useMemoized(() => destination.secondary, [
|
|
||||||
selectedIndex.value,
|
|
||||||
]);
|
|
||||||
|
|
||||||
return AdaptiveScaffold(
|
|
||||||
destinations: destinations
|
|
||||||
.map(
|
|
||||||
(destination) => NavigationDestination(
|
|
||||||
label: destination.label,
|
|
||||||
icon: destination.icon,
|
|
||||||
selectedIcon: destination.selectedIcon,
|
|
||||||
tooltip: destination.tooltip,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.toList(),
|
|
||||||
|
|
||||||
selectedIndex: selectedIndex.value,
|
|
||||||
onSelectedIndexChange: (index) => selectedIndex.value = index,
|
|
||||||
useDrawer: true,
|
|
||||||
|
|
||||||
smallBody: patchAnimated(dispatcher.buildSmall),
|
|
||||||
body: patchAnimated(dispatcher.build),
|
|
||||||
mediumLargeBody: patchAnimated(dispatcher.buildMediumLarge),
|
|
||||||
largeBody: patchAnimated(dispatcher.buildLarge),
|
|
||||||
extraLargeBody: patchAnimated(dispatcher.buildExtraLarge),
|
|
||||||
|
|
||||||
smallSecondaryBody: patchAnimated(secondaryDispatcher?.buildSmall),
|
|
||||||
secondaryBody: patchAnimated(secondaryDispatcher?.build),
|
|
||||||
mediumLargeSecondaryBody: patchAnimated(
|
|
||||||
secondaryDispatcher?.buildMediumLarge,
|
|
||||||
),
|
|
||||||
largeSecondaryBody: patchAnimated(secondaryDispatcher?.buildLarge),
|
|
||||||
extraLargeSecondaryBody: patchAnimated(
|
|
||||||
secondaryDispatcher?.buildExtraLarge,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
import 'package:arbiter/features/adaptive_switcher.dart';
|
|
||||||
import 'package:arbiter/screens/about.dart';
|
|
||||||
import 'package:arbiter/screens/calc.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
final _destinations = [
|
|
||||||
Destination(
|
|
||||||
label: "About",
|
|
||||||
icon: Icon(Icons.info_outline),
|
|
||||||
main: AdaptiveBuilders(build: (_) => About()),
|
|
||||||
),
|
|
||||||
Destination(
|
|
||||||
label: "Calc",
|
|
||||||
icon: Icon(Icons.calculate),
|
|
||||||
main: AdaptiveBuilders(build: (_) => CalcScreen()),
|
|
||||||
),
|
|
||||||
];
|
|
||||||
|
|
||||||
class Home extends StatelessWidget {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return HomeRouter(destinations: _destinations);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,9 +3,12 @@ import 'package:flutter/material.dart' hide Router;
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
runApp(
|
runApp(
|
||||||
MaterialApp(
|
ProviderScope(
|
||||||
home: ProviderScope(child: Scaffold(body: Router())),
|
child: MaterialApp.router(
|
||||||
|
routerConfig: Router().config(),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import 'package:hooks_riverpod/experimental/mutation.dart';
|
|
||||||
import 'package:mtcore/markettakers.dart';
|
import 'package:mtcore/markettakers.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:arbiter/features/pk_manager.dart';
|
import 'package:arbiter/features/pk_manager.dart';
|
||||||
@@ -11,22 +10,22 @@ KeyManager keyManager(Ref ref) {
|
|||||||
return SimpleEd25519Manager();
|
return SimpleEd25519Manager();
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@Riverpod(keepAlive: true)
|
||||||
class Key extends _$Key {
|
class Key extends _$Key {
|
||||||
@override
|
@override
|
||||||
Future<KeyHandle?> build() async {
|
Future<KeyHandle?> build() async {
|
||||||
final manager = SimpleEd25519Manager();
|
final manager = ref.watch(keyManagerProvider);
|
||||||
final keyHandle = await manager.get();
|
final keyHandle = await manager.get();
|
||||||
return keyHandle;
|
return keyHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> create() async {
|
Future<void> create() async {
|
||||||
|
final manager = ref.watch(keyManagerProvider);
|
||||||
if (state.value != null) {
|
if (state.value != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state = await AsyncValue.guard(() async {
|
state = await AsyncValue.guard(() async {
|
||||||
final manager = SimpleEd25519Manager();
|
|
||||||
final newKeyHandle = await manager.create();
|
final newKeyHandle = await manager.create();
|
||||||
return newKeyHandle;
|
return newKeyHandle;
|
||||||
});
|
});
|
||||||
@@ -34,7 +33,7 @@ class Key extends _$Key {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class KeyBootstrapper implements StageFactory {
|
class KeyBootstrapper implements StageFactory {
|
||||||
final MutationTarget ref;
|
final ProviderContainer ref;
|
||||||
|
|
||||||
KeyBootstrapper({required this.ref});
|
KeyBootstrapper({required this.ref});
|
||||||
|
|
||||||
@@ -43,14 +42,14 @@ class KeyBootstrapper implements StageFactory {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<bool> get isAlreadyCompleted async {
|
Future<bool> get isAlreadyCompleted async {
|
||||||
final key = await ref.container.read(keyProvider.future);
|
final key = await ref.read(keyProvider.future);
|
||||||
return key != null;
|
return key != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> start(StageController controller) async {
|
Future<void> start(StageController controller) async {
|
||||||
controller.setIndefiniteProgress();
|
controller.setIndefiniteProgress();
|
||||||
final key = ref.container.read(keyProvider.notifier);
|
final key = ref.read(keyProvider.notifier);
|
||||||
|
|
||||||
await key.create();
|
await key.create();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ final class KeyProvider extends $AsyncNotifierProvider<Key, KeyHandle?> {
|
|||||||
argument: null,
|
argument: null,
|
||||||
retry: null,
|
retry: null,
|
||||||
name: r'keyProvider',
|
name: r'keyProvider',
|
||||||
isAutoDispose: true,
|
isAutoDispose: false,
|
||||||
dependencies: null,
|
dependencies: null,
|
||||||
$allTransitiveDependencies: null,
|
$allTransitiveDependencies: null,
|
||||||
);
|
);
|
||||||
@@ -73,7 +73,7 @@ final class KeyProvider extends $AsyncNotifierProvider<Key, KeyHandle?> {
|
|||||||
Key create() => Key();
|
Key create() => Key();
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$keyHash() => r'6d66204174c4d2d5c76e27f3a8de8f9a9c88a3e0';
|
String _$keyHash() => r'37b209825067adadbb75fe0b4ce936ea1c201dc8';
|
||||||
|
|
||||||
abstract class _$Key extends $AsyncNotifier<KeyHandle?> {
|
abstract class _$Key extends $AsyncNotifier<KeyHandle?> {
|
||||||
FutureOr<KeyHandle?> build();
|
FutureOr<KeyHandle?> build();
|
||||||
|
|||||||
@@ -1,32 +1,24 @@
|
|||||||
import 'dart:async';
|
import 'package:arbiter/screens/dashboard/about.dart';
|
||||||
|
import 'package:arbiter/screens/dashboard/calc.dart';
|
||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart';
|
||||||
|
|
||||||
import 'package:arbiter/features/bootstrap.dart';
|
import 'router.gr.dart';
|
||||||
import 'package:arbiter/home.dart';
|
|
||||||
import 'package:flutter/src/widgets/async.dart';
|
|
||||||
import 'package:flutter/src/widgets/framework.dart';
|
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
||||||
|
|
||||||
final _bootstapCompleter = Completer<void>();
|
@AutoRouterConfig(generateForDir: ['lib/screens'])
|
||||||
|
class Router extends RootStackRouter {
|
||||||
class Router extends HookConsumerWidget {
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
List<AutoRoute> get routes => [
|
||||||
final bootstrapper = useMemoized(
|
AutoRoute(page: Bootstrap.page, path: '/bootstrap', initial: true),
|
||||||
() => Bootstrap(completer: _bootstapCompleter),
|
|
||||||
);
|
|
||||||
final bootstrapFuture = useFuture(_bootstapCompleter.future);
|
|
||||||
|
|
||||||
switch (bootstrapFuture.connectionState) {
|
AutoRoute(
|
||||||
case ConnectionState.none ||
|
page: DashboardRouter.page,
|
||||||
ConnectionState.waiting ||
|
path: '/dashboard',
|
||||||
ConnectionState.active:
|
children: [
|
||||||
return bootstrapper;
|
AutoRoute(page: AboutRoute.page, path: 'about'),
|
||||||
|
AutoRoute(page: CalcRoute.page, path: 'calc'),
|
||||||
case ConnectionState.done:
|
],
|
||||||
break;
|
),
|
||||||
}
|
];
|
||||||
|
|
||||||
return Home();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
80
useragent/lib/router.gr.dart
Normal file
80
useragent/lib/router.gr.dart
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
// dart format width=80
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// AutoRouterGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// coverage:ignore-file
|
||||||
|
|
||||||
|
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||||
|
import 'package:arbiter/screens/bootstrap.dart' as _i2;
|
||||||
|
import 'package:arbiter/screens/dashboard.dart' as _i4;
|
||||||
|
import 'package:arbiter/screens/dashboard/about.dart' as _i1;
|
||||||
|
import 'package:arbiter/screens/dashboard/calc.dart' as _i3;
|
||||||
|
import 'package:auto_route/auto_route.dart' as _i5;
|
||||||
|
|
||||||
|
/// generated route for
|
||||||
|
/// [_i1.AboutScreen]
|
||||||
|
class AboutRoute extends _i5.PageRouteInfo<void> {
|
||||||
|
const AboutRoute({List<_i5.PageRouteInfo>? children})
|
||||||
|
: super(AboutRoute.name, initialChildren: children);
|
||||||
|
|
||||||
|
static const String name = 'AboutRoute';
|
||||||
|
|
||||||
|
static _i5.PageInfo page = _i5.PageInfo(
|
||||||
|
name,
|
||||||
|
builder: (data) {
|
||||||
|
return _i1.AboutScreen();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// generated route for
|
||||||
|
/// [_i2.Bootstrap]
|
||||||
|
class Bootstrap extends _i5.PageRouteInfo<void> {
|
||||||
|
const Bootstrap({List<_i5.PageRouteInfo>? children})
|
||||||
|
: super(Bootstrap.name, initialChildren: children);
|
||||||
|
|
||||||
|
static const String name = 'Bootstrap';
|
||||||
|
|
||||||
|
static _i5.PageInfo page = _i5.PageInfo(
|
||||||
|
name,
|
||||||
|
builder: (data) {
|
||||||
|
return const _i2.Bootstrap();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// generated route for
|
||||||
|
/// [_i3.CalcScreen]
|
||||||
|
class CalcRoute extends _i5.PageRouteInfo<void> {
|
||||||
|
const CalcRoute({List<_i5.PageRouteInfo>? children})
|
||||||
|
: super(CalcRoute.name, initialChildren: children);
|
||||||
|
|
||||||
|
static const String name = 'CalcRoute';
|
||||||
|
|
||||||
|
static _i5.PageInfo page = _i5.PageInfo(
|
||||||
|
name,
|
||||||
|
builder: (data) {
|
||||||
|
return const _i3.CalcScreen();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// generated route for
|
||||||
|
/// [_i4.DashboardRouter]
|
||||||
|
class DashboardRouter extends _i5.PageRouteInfo<void> {
|
||||||
|
const DashboardRouter({List<_i5.PageRouteInfo>? children})
|
||||||
|
: super(DashboardRouter.name, initialChildren: children);
|
||||||
|
|
||||||
|
static const String name = 'DashboardRouter';
|
||||||
|
|
||||||
|
static _i5.PageInfo page = _i5.PageInfo(
|
||||||
|
name,
|
||||||
|
builder: (data) {
|
||||||
|
return const _i4.DashboardRouter();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:mtcore/markettakers.dart';
|
|
||||||
|
|
||||||
class About extends StatelessWidget {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return AboutScreen(decription: "Arbiter is bla bla bla");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +1,31 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:arbiter/providers/key.dart';
|
import 'package:arbiter/providers/key.dart';
|
||||||
import 'package:flutter/src/widgets/framework.dart';
|
import 'package:arbiter/router.gr.dart';
|
||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:mtcore/markettakers.dart';
|
import 'package:mtcore/markettakers.dart';
|
||||||
|
|
||||||
|
@RoutePage()
|
||||||
class Bootstrap extends HookConsumerWidget {
|
class Bootstrap extends HookConsumerWidget {
|
||||||
final Completer<void> completer;
|
const Bootstrap({super.key});
|
||||||
|
|
||||||
const Bootstrap({required this.completer});
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final container = ProviderScope.containerOf( context);
|
final container = ProviderScope.containerOf( context);
|
||||||
|
final completer = useMemoized(() {
|
||||||
|
final completer = Completer<void>();
|
||||||
|
completer.future.then((_) async {
|
||||||
|
if (context.mounted) {
|
||||||
|
final router = AutoRouter.of(context);
|
||||||
|
router.replace(const DashboardRouter());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return completer;
|
||||||
|
}, []);
|
||||||
final stages = useMemoized(() {
|
final stages = useMemoized(() {
|
||||||
return [KeyBootstrapper(ref: container)];
|
return [KeyBootstrapper(ref: container)];
|
||||||
}, []);
|
}, []);
|
||||||
@@ -21,6 +33,7 @@ class Bootstrap extends HookConsumerWidget {
|
|||||||
() => Bootstrapper(stages: stages, onCompleted: completer),
|
() => Bootstrapper(stages: stages, onCompleted: completer),
|
||||||
[stages],
|
[stages],
|
||||||
);
|
);
|
||||||
|
|
||||||
return bootstrapper;
|
return bootstrapper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
42
useragent/lib/screens/dashboard.dart
Normal file
42
useragent/lib/screens/dashboard.dart
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import 'package:arbiter/router.gr.dart';
|
||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart';
|
||||||
|
|
||||||
|
const breakpoints = MaterialAdaptiveBreakpoints();
|
||||||
|
|
||||||
|
final routes = [AboutRoute(), CalcRoute()];
|
||||||
|
|
||||||
|
@RoutePage()
|
||||||
|
class DashboardRouter extends StatelessWidget {
|
||||||
|
const DashboardRouter({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AutoTabsRouter(
|
||||||
|
routes: routes,
|
||||||
|
transitionBuilder: (context, child, animation) => FadeTransition(
|
||||||
|
opacity: animation,
|
||||||
|
// the passed child is technically our animated selected-tab page
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
builder: (context, child) {
|
||||||
|
final tabsRouter = AutoTabsRouter.of(context);
|
||||||
|
final currentActive = tabsRouter.activeIndex;
|
||||||
|
return AdaptiveScaffold(
|
||||||
|
destinations: [
|
||||||
|
NavigationDestination(icon: Icon(Icons.book), label: "About"),
|
||||||
|
NavigationDestination(icon: Icon(Icons.calculate), label: "Calc"),
|
||||||
|
],
|
||||||
|
body: (ctx) => child,
|
||||||
|
onSelectedIndexChange: (index) {
|
||||||
|
tabsRouter.navigate(routes[index]);
|
||||||
|
},
|
||||||
|
selectedIndex: currentActive,
|
||||||
|
transitionDuration: Duration(milliseconds: 800),
|
||||||
|
internalAnimations: true,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
12
useragent/lib/screens/dashboard/about.dart
Normal file
12
useragent/lib/screens/dashboard/about.dart
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mtcore/markettakers.dart' as mt;
|
||||||
|
|
||||||
|
|
||||||
|
@RoutePage()
|
||||||
|
class AboutScreen extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return mt.AboutScreen(decription: "Arbiter is bla bla bla");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
@RoutePage()
|
||||||
class CalcScreen extends StatefulWidget {
|
class CalcScreen extends StatefulWidget {
|
||||||
const CalcScreen({super.key});
|
const CalcScreen({super.key});
|
||||||
|
|
||||||
@@ -49,6 +49,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.13.0"
|
version: "2.13.0"
|
||||||
|
auto_route:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: auto_route
|
||||||
|
sha256: e9acfeb3df33d188fce4ad0239ef4238f333b7aa4d95ec52af3c2b9360dcd969
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "11.1.0"
|
||||||
|
auto_route_generator:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: auto_route_generator
|
||||||
|
sha256: "04300eaf5821962aae8b5cd94f67013fd2fd326dc3be212d3ec1ae7470f09834"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "10.4.0"
|
||||||
biometric_signature:
|
biometric_signature:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -283,10 +299,10 @@ packages:
|
|||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: HEAD
|
ref: HEAD
|
||||||
resolved-ref: "4852b5041d8d9ed6cacb4dc4c6723086f0612e37"
|
resolved-ref: b2e3615901a7ab837cb7fc35efbfcf8b55f27638
|
||||||
url: "https://github.com/hdbg/flutter_adaptive_scaffold.git"
|
url: "https://github.com/hdbg/flutter_adaptive_scaffold.git"
|
||||||
source: git
|
source: git
|
||||||
version: "0.3.3+1"
|
version: "1.0.0+1"
|
||||||
flutter_bloc:
|
flutter_bloc:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -465,6 +481,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.1.0"
|
||||||
|
hotreloader:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: hotreloader
|
||||||
|
sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.3.0"
|
||||||
http:
|
http:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -545,6 +569,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.2"
|
version: "3.0.2"
|
||||||
|
lean_builder:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: lean_builder
|
||||||
|
sha256: "6af3cfbf34400eb14b89fe20111e5981e7083362f00ea10b9ed2a6e833250d76"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.6"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1074,10 +1106,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: watcher
|
name: watcher
|
||||||
sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635"
|
sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "1.1.4"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1126,6 +1158,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.0"
|
||||||
|
xxh3:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: xxh3
|
||||||
|
sha256: "399a0438f5d426785723c99da6b16e136f4953fb1e9db0bf270bd41dd4619916"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0"
|
||||||
yaml:
|
yaml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ dependencies:
|
|||||||
riverpod_annotation: ^4.0.0
|
riverpod_annotation: ^4.0.0
|
||||||
grpc: ^5.1.0
|
grpc: ^5.1.0
|
||||||
flutter_hooks: ^0.21.3+1
|
flutter_hooks: ^0.21.3+1
|
||||||
|
auto_route: ^11.1.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
@@ -35,6 +36,7 @@ dev_dependencies:
|
|||||||
flutter_lints: ^6.0.0
|
flutter_lints: ^6.0.0
|
||||||
riverpod_generator: ^4.0.0+1
|
riverpod_generator: ^4.0.0+1
|
||||||
build_runner: ^2.12.2
|
build_runner: ^2.12.2
|
||||||
|
auto_route_generator: ^10.4.0
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
uses-material-design: true
|
uses-material-design: true
|
||||||
Reference in New Issue
Block a user