armyknife_riverpodx 2.0.0
armyknife_riverpodx: ^2.0.0 copied to clipboard
Flutter+Riverpod support library.
armyknife_riverpodx #
A support library for efficient state management in Flutter+Riverpod development. It provides convenient utility functions including ProviderContainer construction support, safe Stream monitoring, and logical equality checking for list-type data.
Features #
- ProviderContainer Builder: Builder pattern for efficiently constructing dependencies
- Stream Hooks: Safe Stream monitoring functionality for UI
- List-type Properties: Support for logical equality checking in Riverpod
Getting started #
Add the following dependencies to your pubspec.yaml
:
dependencies:
armyknife_riverpodx: ^1.1.0
# Add individually as needed
flutter_hooks: ^0.21.2
flutter_riverpod: ^2.6.1
hooks_riverpod: ^2.6.1
# Recommended as an alternative to ListSelectProperty
flutter_riverpod_watch_plus: ^1.0.0
Usage #
Provides convenient features for Riverpod:
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:flutter_riverpod_watch_plus/flutter_riverpod_watch_plus.dart';
import 'package:armyknife_riverpodx/armyknife_riverpodx.dart';
// ProviderContainer construction
final container = ProviderContainerBuilder()
.inject(stubProvider, implementationProvider)
.build();
// Stream monitoring
class MyWidget extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
useEventStream(
() => someStream,
(data) {
// Process data safely
},
);
return Container();
}
}
// List-type properties (deprecated in v1.1.1)
// Use flutter_riverpod_watch_plus instead
final listProvider = StateProvider<List<String>>((ref) {
return ['item1', 'item2', 'item3'];
});
class ListWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
// Use watchBy() for efficient monitoring
final items = ref.watchBy(listProvider, (list) => list);
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) => Text(items[index]),
);
}
}
Migration 1.0.0 to 1.1.0 #
In version 1.1.0, the library structure was reorganized and functionality was separated into specialized packages.
Major Changes #
- Export of
riverpod
libraries has been discontinued useFutureContext
functionality has been moved tofuture_context2_hooks
package- Asynchronous processing functionality has been moved to
riverpod_container_async
package - Individual dependency library imports need to be added as necessary
Import Changes #
Writing in 1.0.0:
// All riverpod features available with one import
import 'package:armyknife_riverpodx/armyknife_riverpodx.dart';
class MyWidget extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final futureContext = useFutureContext();
// flutter_hooks, flutter_riverpod, hooks_riverpod all available
return Container();
}
}
Writing in 1.1.0:
// Import required libraries individually
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:future_context2_hooks/future_context2_hooks.dart';
import 'package:armyknife_riverpodx/armyknife_riverpodx.dart';
class MyWidget extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final futureContext = useFutureContext(); // Provided by future_context2_hooks
// Same functionality available
return Container();
}
}
Asynchronous Processing Migration #
Writing in 1.0.0:
import 'package:armyknife_riverpodx/armyknife_riverpodx.dart';
final container = ProviderContainer(
overrides: [
...ProviderContainerAsyncHelper.inject(),
],
);
// Asynchronous initialization and disposal processing
await container.waitInitializeTasks();
await container.disposeAsync();
Writing in 1.1.0:
// Asynchronous processing functionality moved to separate package
import 'package:riverpod_container_async/riverpod_container_async.dart';
import 'package:armyknife_riverpodx/armyknife_riverpodx.dart';
final container = ProviderContainer(
overrides: [
...ProviderContainerAsyncHelper.inject(),
],
);
// Same API available
await container.waitInitializeTasks();
await container.disposeAsync();
Migration 1.1.0 to 1.1.1 #
In version 1.1.1, ListSelectProperty
has been deprecated and migrated to the more efficient and user-friendly flutter_riverpod_watch_plus
package.
ListSelectProperty Migration #
Writing in 1.1.0 (deprecated):
import 'package:armyknife_riverpodx/armyknife_riverpodx.dart';
// List state management using ListSelectProperty
final listProvider = StateProvider<ListSelectProperty<String>>((ref) {
return ListSelectProperty(['item1', 'item2', 'item3']);
});
class ListWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final listProperty = ref.watch(listProvider);
final items = listProperty.requireList();
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) => Text(items[index]),
);
}
}
Writing in 1.1.1 (recommended):
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod_watch_plus/flutter_riverpod_watch_plus.dart';
// Handle List directly and monitor efficiently with watchBy()
final listProvider = StateProvider<List<String>>((ref) {
return ['item1', 'item2', 'item3'];
});
class ListWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
// With watchBy(), no re-rendering when content is the same
final items = ref.watchBy(listProvider, (list) => list);
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) => Text(items[index]),
);
}
}
Required Dependencies #
Add the following to pubspec.yaml
:
dependencies:
flutter_riverpod_watch_plus: ^1.0.0
Migration Benefits #
- Simpler API: No need for wrapper classes, direct List handling
- Efficient State Monitoring: Prevents unnecessary re-rendering with
watchBy()
- Type Safety: No need for exception-throwing methods like
requireList()
- Flexibility: Supports collections other than List (Map, Set)
Additional information #
This package was created to streamline state management in Flutter development.
Note:
- Asynchronous initialization and disposal processing for ProviderContainer has been moved to the separate package
riverpod_container_async
.- FutureContext and Hooks integration functionality has been moved to the separate package
future_context2_hooks
.
Bug reports and feature requests are accepted at GitHub.