diff --git a/lib/markettakers.dart b/lib/markettakers.dart deleted file mode 100644 index 66e199f..0000000 --- a/lib/markettakers.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:markettakers/main.dart'; - -class SimpleStage extends StageFactory { - final String title = "Test"; - - @override - Future get isCompleted async { - return false; - } - - @override - Future start(StageController controller) async { - await Future.delayed(Duration(seconds: 2)); - controller.updateProgress(0.3); - controller.updateTitle("test 2"); - - await Future.delayed(Duration(seconds: 2)); - controller.updateProgress(0.6); - } -} - -class SimpleStage2 extends StageFactory { - final String title = "Test 2"; - - @override - Future get isCompleted async { - return false; - } - - @override - Future start(StageController controller) async { - await Future.delayed(Duration(seconds: 2)); - controller.updateProgress(0.3); - controller.updateTitle("test 5"); - - await Future.delayed(Duration(seconds: 2)); - controller.updateProgress(0.6); - } -} - -void main() async { - WidgetsFlutterBinding.ensureInitialized(); - init(); - final completer = Completer(); - completer.future.then((_) { - talker.info("Bootstrapper completed, launching app"); - }); - runApp( - Scaffold( - body: Bootstrapper( - stages: [SimpleStage(), SimpleStage2()], - onCompleted: completer, - ), - ), - ); -} diff --git a/lib/src/about_screen.dart b/lib/src/about_screen.dart index 5d3aac2..0d9e5b6 100644 --- a/lib/src/about_screen.dart +++ b/lib/src/about_screen.dart @@ -18,10 +18,7 @@ class AboutScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - Flexible( - flex: 2, - child: Loader(flavour: LoaderFlavour.big, playing: true), - ), + Flexible(flex: 2, child: Loader.playing(flavour: LoaderFlavour.big)), Flexible( flex: 1, child: Text( diff --git a/lib/src/bootstrapper.dart b/lib/src/bootstrapper.dart index ae705f1..984e77a 100644 --- a/lib/src/bootstrapper.dart +++ b/lib/src/bootstrapper.dart @@ -180,9 +180,7 @@ class Bootstrapper extends StatelessWidget { children: [ Flexible( flex: 3, - child: Center( - child: Loader(flavour: LoaderFlavour.big, playing: true), - ), + child: Center(child: Loader.playing(flavour: LoaderFlavour.big)), ), Flexible(flex: 1, child: BootstrapFooter()), ], diff --git a/lib/src/loaders/base_loader.dart b/lib/src/loaders/base_loader.dart deleted file mode 100644 index d26f8c8..0000000 --- a/lib/src/loaders/base_loader.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:rive/rive.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -part 'base_loader.g.dart'; - -@riverpod -class LoaderState extends _$LoaderState { - @override - bool build() { - return false; - } - - void stop() { - state = false; - } - - void start() { - state = true; - } -} - -class BaseLoader extends HookConsumerWidget { - final String filepath; - final Fit fit; - - const BaseLoader({super.key, required this.filepath, this.fit = Fit.contain}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final loaderState = ref.watch(loaderStateProvider); - final animFile = useMemoized( - () => FileLoader.fromAsset(filepath, riveFactory: Factory.flutter), - ); - - useEffect(() { - return animFile.dispose; - }, [animFile]); - - return RiveWidgetBuilder( - fileLoader: animFile, - builder: (context, state) { - switch (state) { - case RiveLoading(): - return const Center(child: CircularProgressIndicator()); - - case RiveFailed(): - final message = state.error.toString(); - return ErrorWidget.withDetails( - message: message, - error: FlutterError(message), - ); - - case RiveLoaded(:final file): - final controller = RiveWidgetController( - file, - stateMachineSelector: StateMachineSelector.byIndex(0), - ); - controller.active = loaderState; - return RiveWidget(controller: controller, fit: fit); - } - }, - ); - } -} diff --git a/lib/src/loaders/base_loader.g.dart b/lib/src/loaders/base_loader.g.dart deleted file mode 100644 index 4412774..0000000 --- a/lib/src/loaders/base_loader.g.dart +++ /dev/null @@ -1,62 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'base_loader.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint, type=warning - -@ProviderFor(LoaderState) -const loaderStateProvider = LoaderStateProvider._(); - -final class LoaderStateProvider extends $NotifierProvider { - const LoaderStateProvider._() - : super( - from: null, - argument: null, - retry: null, - name: r'loaderStateProvider', - isAutoDispose: true, - dependencies: null, - $allTransitiveDependencies: null, - ); - - @override - String debugGetCreateSourceHash() => _$loaderStateHash(); - - @$internal - @override - LoaderState create() => LoaderState(); - - /// {@macro riverpod.override_with_value} - Override overrideWithValue(bool value) { - return $ProviderOverride( - origin: this, - providerOverride: $SyncValueProvider(value), - ); - } -} - -String _$loaderStateHash() => r'e220e72e138a376390817c6e5a4051c7e2c665b3'; - -abstract class _$LoaderState extends $Notifier { - bool build(); - @$mustCallSuper - @override - void runBuild() { - final created = build(); - final ref = this.ref as $Ref; - final element = - ref.element - as $ClassProviderElement< - AnyNotifier, - bool, - Object?, - Object? - >; - element.handleValue(ref, created); - } -} diff --git a/lib/src/loaders/loader.dart b/lib/src/loaders/loader.dart index 4173551..ef9e81e 100644 --- a/lib/src/loaders/loader.dart +++ b/lib/src/loaders/loader.dart @@ -1,4 +1,6 @@ -import 'package:markettakers/src/loaders/base_loader.dart'; +import 'package:bloc/bloc.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:rive/rive.dart'; enum LoaderFlavour { @@ -10,10 +12,69 @@ enum LoaderFlavour { final String filepath; } -class Loader extends BaseLoader { - final LoaderFlavour flavour; - final bool playing; +class LoaderController extends Cubit { + LoaderController() : super(false); - Loader({super.key, required this.flavour, this.playing = false}) - : super(filepath: flavour.filepath, fit: Fit.contain); + void show() => emit(true); + void hide() => emit(false); +} + +class Loader extends HookWidget { + final LoaderFlavour flavour; + final Fit fit; + final LoaderController controller; + + const Loader( + this.controller, { + super.key, + required this.flavour, + this.fit = Fit.contain, + }); + + Loader.playing({required LoaderFlavour flavour, Fit fit = Fit.contain}) + : this(LoaderController()..show(), flavour: flavour, fit: fit); + Loader.stopped({required LoaderFlavour flavour, Fit fit = Fit.contain}) + : this(LoaderController()..hide(), flavour: flavour, fit: fit); + + @override + Widget build(BuildContext context) { + final animFile = useMemoized( + () => + FileLoader.fromAsset(flavour.filepath, riveFactory: Factory.flutter), + ); + + useEffect(() { + return animFile.dispose; + }, [animFile]); + + return RiveWidgetBuilder( + fileLoader: animFile, + builder: (context, state) { + switch (state) { + case RiveLoading(): + return const Center(child: CircularProgressIndicator()); + + case RiveFailed(): + final message = state.error.toString(); + return ErrorWidget.withDetails( + message: message, + error: FlutterError(message), + ); + + case RiveLoaded(:final file): + final controller = RiveWidgetController( + file, + stateMachineSelector: StateMachineSelector.byIndex(0), + ); + controller.active = this.controller.state; + + this.controller.stream.listen((toggle) { + controller.active = toggle; + }); + + return RiveWidget(controller: controller, fit: fit); + } + }, + ); + } } diff --git a/pubspec.yaml b/pubspec.yaml index df6f089..77da413 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: markettakers description: "MarketTakers library" version: 1.0.0 -publish_to: none +publish_to: https://gitea.tailc58da6.ts.net//api/packages/MarketTakers/pub/ environment: sdk: ^3.9.2