mirror of
https://github.com/rive-app/rive-flutter.git
synced 2025-08-06 16:40:27 +08:00

Introduces a new Core field type which does not produce stored fields. Instead it provides a callback which can be keyed and unique per type so time based events can trigger against their property keys. This is to allow things like nested trigger inputs and triggering events from the timeline. Draft as there's a bunch more work to do for actually invoking them from the StateMachine & LinearAnimations. In the meantime the tests can do some sanity testing. - [x] Generate core types that do not produce stored fields. - [x] Massage Keyframe hierarchy to allow for non stored value Keyframes (markers for trigger). - [x] Key those core types with specialized keyframes. - [x] Pass context (like StateMachine) to those triggers and see it all tie together. Diffs= 6058b52ce Timeline events & Core Callback type (#5877) Co-authored-by: Luigi Rosso <luigi-rosso@users.noreply.github.com>
124 lines
4.1 KiB
Dart
124 lines
4.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:rive_example/custom_asset_loading.dart';
|
|
import 'package:rive_example/custom_cached_asset_loading.dart';
|
|
import 'package:rive_example/carousel.dart';
|
|
import 'package:rive_example/custom_controller.dart';
|
|
import 'package:rive_example/event_sounds.dart';
|
|
import 'package:rive_example/example_state_machine.dart';
|
|
import 'package:rive_example/liquid_download.dart';
|
|
import 'package:rive_example/little_machine.dart';
|
|
import 'package:rive_example/play_one_shot_animation.dart';
|
|
import 'package:rive_example/play_pause_animation.dart';
|
|
import 'package:rive_example/simple_animation.dart';
|
|
import 'package:rive_example/simple_animation_network.dart';
|
|
import 'package:rive_example/simple_machine_listener.dart';
|
|
import 'package:rive_example/simple_state_machine.dart';
|
|
import 'package:rive_example/skinning_demo.dart';
|
|
import 'package:rive_example/state_machine_skills.dart';
|
|
import 'package:rive_example/basic_text.dart';
|
|
|
|
void main() => runApp(
|
|
MaterialApp(
|
|
title: 'Rive Example',
|
|
home: const RiveExampleApp(),
|
|
darkTheme: ThemeData.dark().copyWith(
|
|
scaffoldBackgroundColor: _backgroundColor,
|
|
appBarTheme: const AppBarTheme(backgroundColor: _appBarColor),
|
|
colorScheme:
|
|
ColorScheme.fromSwatch().copyWith(primary: _primaryColor),
|
|
),
|
|
themeMode: ThemeMode.dark,
|
|
),
|
|
);
|
|
|
|
/// An example application demoing Rive.
|
|
class RiveExampleApp extends StatefulWidget {
|
|
const RiveExampleApp({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
State<RiveExampleApp> createState() => _RiveExampleAppState();
|
|
}
|
|
|
|
class _RiveExampleAppState extends State<RiveExampleApp> {
|
|
// Example animations
|
|
final _pages = [
|
|
const _Page('Simple Animation - Asset', SimpleAssetAnimation()),
|
|
const _Page('Simple Animation - Network', SimpleNetworkAnimation()),
|
|
const _Page('Play/Pause Animation', PlayPauseAnimation()),
|
|
const _Page('Play One-Shot Animation', PlayOneShotAnimation()),
|
|
const _Page('Button State Machine', ExampleStateMachine()),
|
|
const _Page('Skills Machine', StateMachineSkills()),
|
|
const _Page('Little Machine', LittleMachine()),
|
|
const _Page('Liquid Download', LiquidDownload()),
|
|
const _Page('Custom Controller - Speed', SpeedyAnimation()),
|
|
const _Page('Simple State Machine', SimpleStateMachine()),
|
|
const _Page('State Machine with Listener', StateMachineListener()),
|
|
const _Page('Skinning Demo', SkinningDemo()),
|
|
const _Page('Animation Carousel', AnimationCarousel()),
|
|
const _Page('Basic Text', BasicText()),
|
|
const _Page('Custom Asset Loading', CustomAssetLoading()),
|
|
const _Page('Custom Cached Asset Loading', CustomCachedAssetLoading()),
|
|
const _Page('Event Sounds', EventSounds()),
|
|
];
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(title: const Text('Rive Examples')),
|
|
body: Center(
|
|
child: ListView.separated(
|
|
shrinkWrap: true,
|
|
itemBuilder: (context, index) => _NavButton(page: _pages[index]),
|
|
separatorBuilder: (context, index) => const SizedBox(height: 16),
|
|
itemCount: _pages.length,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// Class used to organize demo pages.
|
|
class _Page {
|
|
final String name;
|
|
final Widget page;
|
|
|
|
const _Page(this.name, this.page);
|
|
}
|
|
|
|
/// Button to navigate to demo pages.
|
|
class _NavButton extends StatelessWidget {
|
|
const _NavButton({required this.page});
|
|
|
|
final _Page page;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Center(
|
|
child: ElevatedButton(
|
|
child: SizedBox(
|
|
width: 250,
|
|
child: Center(
|
|
child: Text(
|
|
page.name,
|
|
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
),
|
|
onPressed: () {
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute<void>(
|
|
builder: (context) => page.page,
|
|
),
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
const _appBarColor = Color(0xFF323232);
|
|
const _backgroundColor = Color(0xFF1D1D1D);
|
|
const _primaryColor = Color(0xFF57A5E0);
|