value_listenables 0.0.2-prerelease.20 copy "value_listenables: ^0.0.2-prerelease.20" to clipboard
value_listenables: ^0.0.2-prerelease.20 copied to clipboard

An state management library based on value_listenables.

example/lib/main.dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:value_listenables/value_listenables.dart';

void main() => runApp(MaterialApp(
      home: Home(),
    ));

class TextController extends ControllerBase<TextController> {
  final rawA = ValueNotifier(1);
  ValueListenable<String> get aString => rawA.view().map((e) => e.toString());
  ValueListenable<Text> get aText => aString.map(Text.new);

  final b = TextEditingController(text: 'b');
  ValueListenable<String> get bString => b.view().map((e) => e.text);

  final rawC = ValueNotifier(2.0);
  ValueListenable<String> get cString => rawC.view().map((e) => e.toString());
  ValueListenable<Text> get cText => cString.map(Text.new);

  ValueListenable<Slider> get cSlider => rawC.view().map(
        (e) => Slider(
          value: e,
          min: 0,
          max: 3,
          onChanged: (v) => rawC.value = v,
        ),
      );

  ValueListenable<String> get c =>
      rawC.view().map((e) => e * -1).map((e) => e.toStringAsFixed(2));

  ValueListenable<String> get text => aString.view().bind(
      (a) => bString.view().bind((b) => c.view().map((c) => '$a, $b, $c')));
  ValueListenable<Text> get textWidget => text.map(Text.new);

  void incrementA() => rawA.value = rawA.value + 1;
  void decrementA() => rawA.value = rawA.value - 1;

  void init() {
    print("init");
    super.init();
  }

  void dispose() {
    print("dispose");
    b.dispose();
    rawC.dispose();
    super.dispose();
  }
}

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Example'),
      ),
      body: ControllerInjectorBuilder<TextController>(
        factory: (context) => ControllerBase.create(() => TextController()),
        builder: (context, controller) => Body(
          controller: controller,
        ),
      ),
    );
  }
}

class Body extends ControllerWidget<TextController> {
  const Body({
    Key? key,
    required ControllerHandle<TextController> controller,
  }) : super(key: key, controller: controller);

  @override
  Widget build(ControllerContext<TextController> context) {
    return Column(
      children: [
        SizedBox(height: 24),
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: controller.textWidget.build(),
        ),
        SizedBox(height: 16),
        TextField(
          controller: controller.b,
        ),
        SizedBox(height: 16),
        Expanded(
          child: ListView(
            padding: EdgeInsets.symmetric(horizontal: 16),
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  TextButton(
                    onPressed: controller.incrementA,
                    child: Text('+'),
                  ),
                  controller.aText.build(),
                  TextButton(
                    onPressed: controller.decrementA,
                    child: Text('-'),
                  ),
                ],
              ),
              Text('C:'),
              controller.cText.build(),
              controller.cSlider.build(),
            ],
          ),
        ),
        SizedBox(height: 24),
      ],
    );
  }
}
0
likes
135
points
0
downloads

Publisher

unverified uploader

Weekly Downloads

An state management library based on value_listenables.

Homepage

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter, meta

More

Packages that depend on value_listenables