Witt

Simple state management powered by ValueNotifier with service locator.

Getting started

Installing package

flutter pub add witt
flutter pub get

Import it

import 'package:witt/witt.dart

Usage

Basic usage

class CounterController {
  final counter = ValueNotifier(0);

  void incrementCounter() {
    counter.value++;
  }
}

// Register your service.
WService.addSingleton(() => CounterController());

// In your widget.
final counterC = WService.get<CounterController>();
return Scaffold(
    ...
    body: WListener(
      notifier: counterC.counter,
      builder: (context) => Text(counterC.counter.value.toString()),
    ),
);

Routing

// Set `navigatorKey` with`WRouter.navigatorKey` and set onGenerateRoute.
return MaterialApp(
  navigatorKey: WRouter.navigatorKey,
  onGenerateRoute: (settings) => WRouter.onGenerateMaterialRoute(
    settings: settings,
    pages: [
      WPage(
        path: "/",
        builder: (context, args) => HomePage(args: args),
        serviceBuilder: (context, args) {
          WService.addSingleton(() => Service1());
          WService.addSingleton(() => Service2());
        }
      )
    ],
  ),
);

// Push page
WRouter.pushNamed("/");

Listen to ValueNotifier using extensions

// Listen to single `ValueNotifer`
return counterC.counter.builder(
    (context, value) => Text(value.toString()),
);

// Listen to multiple `ValueNotifer`
return [
    counterC.counter,
    counterC.counter2,
    counterC.counter3,
].builder((context) {
    value = counterC.counter.value;
    value2 = counterC.counter2.value;
    value3 = counterC.counter3.value;

    return Column(children: [
        Text(value.toString()),
        Text(value2.toString()),
        Text(value3.toString()),
    ]);
});

Important note

Widget will not be re-rendered if WListener return const widget.

WListener(
  notifier: counterC.counter,
  (context, value) => const _CounterText(),
);

...

// This widget will not be re-rendered.
class _CounterText extends StatelessWidget {
  const _CounterText({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final counterC = WService.get<CounterController>();
    final counterValue = counterC.counter.value;

    return Center(child: Text(counterValue.toString()));
  }
}

Motivation

The main idea of ​​this library being created is to manage state, dependency injection and routes in one library without bloated features.

Additional Information

This library is currently on experimental status and not ready for production. The API may change slightly when more features are added, and some use-cases may not be as simple as they could be.

Contributing

Contributions are welcomed!

Here is a curated list of how you can help:

  • Report bugs and scenarios that are difficult to implement
  • Report parts of the documentation that are unclear
  • Update the documentation / add examples
  • Implement new features by making a pull-request

Libraries

witt