nocterm_riverpod
Riverpod state management bindings for nocterm terminal UIs.
Bridges Riverpod providers into nocterm's component tree via InheritedComponent, enabling per-component granular rebuilds without manual container.listen() wiring or prop drilling.
Features
RiverpodScope— provides aProviderContainerdown the nocterm component treeRiverpodConsumer<T>— rebuilds its subtree when a provider emits a new valueRiverpodSelector<T, R>— rebuilds only when a selected slice of state changes (by equality)RiverpodListener<T>— listens for provider changes for side effects without rebuildingBuildContextextensions —context.containerandcontext.read<T>(provider)convenience accessors
Getting started
dependencies:
nocterm_riverpod: ^0.1.0
Wrap your app in RiverpodScope, then use RiverpodConsumer anywhere in the tree:
import 'package:nocterm/nocterm.dart';
import 'package:nocterm_riverpod/nocterm_riverpod.dart';
import 'package:riverpod/riverpod.dart';
final counterProvider = StateProvider<int>((ref) => 0);
void main() {
final container = ProviderContainer();
runApp(
RiverpodScope(
container: container,
child: RiverpodConsumer(
provider: counterProvider,
builder: (context, count) => Text('Count: $count'),
),
),
);
}
Usage with View Models
RiverpodConsumer(
provider: tasksPanelViewModelProvider,
builder: (context, state) {
final vm = context.read(tasksPanelViewModelProvider.notifier);
return TasksPanel(state: state, viewModel: vm);
},
)
Selective Rebuilds
RiverpodSelector(
provider: appBarViewModelProvider,
selector: (state) => state.panelFocus,
builder: (context, focus) => StatusBar(isFocused: focus == PanelFocus.main),
)
Side Effects
RiverpodListener(
provider: statusMessageProvider,
listener: (context, previous, message) {
if (message != null) log(message);
},
child: MyPanel(),
)
Libraries
- nocterm_riverpod
- Riverpod state management bindings for nocterm terminal UIs.