Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'package:easy_refresh/easy_refresh.dart';
- import 'package:flutter/material.dart';
- import 'package:rive/rive.dart';
- import 'package:sizer/sizer.dart';
- class SunriseIndicator extends StatefulWidget {
- final IndicatorState state;
- final bool reverse;
- const SunriseIndicator({
- super.key,
- required this.state,
- required this.reverse,
- });
- @override
- State<SunriseIndicator> createState() => _SunriseIndicatorState();
- }
- class _SunriseIndicatorState extends State<SunriseIndicator> {
- // Only this needs manual dispose — RiveWidgetBuilder handles the rest
- late final FileLoader _fileLoader = FileLoader.fromAsset(
- 'assets/rive/pull_refresh.riv',
- riveFactory: Factory.rive,
- );
- ViewModelInstanceNumber? _pullAmount;
- ViewModelInstanceTrigger? _loadingTrigger;
- ViewModelInstanceTrigger? _finishTrigger;
- double get _offset => widget.state.offset;
- double get _actualTriggerOffset => widget.state.actualTriggerOffset;
- @override
- void initState() {
- super.initState();
- widget.state.notifier.addModeChangeListener(_onModeChange);
- }
- @override
- void dispose() {
- widget.state.notifier.removeModeChangeListener(_onModeChange);
- _fileLoader.dispose(); // Only thing you need to dispose manually
- super.dispose();
- }
- void _onLoaded(RiveLoaded state) {
- // RiveWidgetBuilder gives you the controller via onLoaded callback
- final vmi = state.controller.dataBind(DataBind.auto());
- _pullAmount = vmi.number('pullAmount');
- _loadingTrigger = vmi.trigger('loadingTrigger');
- _finishTrigger = vmi.trigger('finishTrigger');
- }
- void _onModeChange(IndicatorMode mode, double offset) {
- switch (mode) {
- case IndicatorMode.ready:
- _loadingTrigger?.trigger();
- break;
- case IndicatorMode.processed:
- _finishTrigger?.trigger();
- break;
- case IndicatorMode.done:
- _pullAmount?.value = 0;
- break;
- default:
- break;
- }
- }
- @override
- void didUpdateWidget(covariant SunriseIndicator oldWidget) {
- super.didUpdateWidget(oldWidget);
- print(_pullAmount);
- if (_pullAmount != null) {
- _pullAmount!.value = _offset < _actualTriggerOffset
- ? (_offset / _actualTriggerOffset * 100).clamp(0.0, 100.0)
- : 100.0;
- }
- }
- @override
- Widget build(BuildContext context) {
- return SizedBox(
- height: 27.h,
- width: 100.w,
- child: RiveWidgetBuilder(
- fileLoader: _fileLoader,
- artboardSelector: ArtboardSelector.byName('Artboard'),
- stateMachineSelector: StateMachineSelector.byName('Main'),
- onLoaded: _onLoaded,
- // Wire up data binding here
- builder: (context, state) => switch (state) {
- RiveLoading() => const SizedBox.shrink(),
- RiveFailed() => const SizedBox.shrink(), // or show an error
- RiveLoaded() => RiveWidget(
- controller: state.controller,
- fit: Fit.fitWidth,
- ),
- },
- ),
- );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment