Redus

Developer utilities for Dart - Fine-grained reactivity, dependency injection, and more.

Dart pub package

Modules

Module Import Description
Reactivity package:redus/reactivity.dart Vue-like fine-grained reactivity
DI package:redus/di.dart Dependency injection with key support
All package:redus/redus.dart All modules combined

Installation

dependencies:
  redus: ^0.4.0

Dependency Injection

Simple service locator with type-based and key-based lookup.

import 'package:redus/di.dart';

// Register by type
register<ApiService>(ApiService());
final api = get<ApiService>();

// Register multiple instances with keys
register<Logger>(ConsoleLogger(), key: #console);
register<Logger>(FileLogger(), key: #file);
final log = get<Logger>(key: #console);

// Factory registration
registerFactory<DatabaseConnection>(() => DatabaseConnection());

DI API

API Description
register<T>(instance, {key}) Register singleton
registerFactory<T>(factory, {key}) Register factory
get<T>({key}) Get instance
isRegistered<T>({key}) Check registration
unregister<T>({key}) Remove registration
resetLocator() Clear all

Reactivity

Vue-like fine-grained reactivity with automatic dependency tracking.

import 'package:redus/reactivity.dart';

final count = ref(0);
final doubled = computed(() => count.value * 2);

watchEffect((_) {
  print('Count: ${count.value}, Doubled: ${doubled.value}');
});

count.value = 5;  // Prints: "Count: 5, Doubled: 10"

Core API

API Description
ref<T>(value) Mutable reactive reference
computed<T>(getter) Cached computed value
readonly<T>(source) Readonly wrapper
watchEffect(effect) Auto-tracking effect
watch(source, callback) Explicit source watching

Utilities

API Description
isRef(value) Check if Ref
unref<T>(maybeRef) Unwrap ref or return value
toRef<T>(source) Normalize to ref
toValue<T>(source) Normalize to value

Advanced

API Description
shallowRef<T>(value) Shallow reactive ref
customRef<T>(factory) Custom ref with track/trigger
effectScope() Group effects for disposal
markRaw<T>(value) Prevent reactivity

Examples

Debounced Ref

Ref<T> useDebouncedRef<T>(T value, {Duration delay = const Duration(milliseconds: 200)}) {
  Timer? timeout;
  return customRef((track, trigger) => (
    get: () { track(); return value; },
    set: (newValue) {
      timeout?.cancel();
      timeout = Timer(delay, () { value = newValue; trigger(); });
    },
  ));
}

Effect Scoping

final scope = effectScope();

scope.run(() {
  final doubled = computed(() => count.value * 2);
  watchEffect((_) => print('Doubled: ${doubled.value}'));
});

scope.stop();  // Dispose all effects

License

MIT License

Libraries

di
Dependency injection module.
reactivity
Fine-grained reactivity system inspired by Vue's Composition API.
redus
Redus - Developer utilities for convenience and performance.