value_notifier_plus 0.1.0+6 copy "value_notifier_plus: ^0.1.0+6" to clipboard
value_notifier_plus: ^0.1.0+6 copied to clipboard

ValueNotifier Plus.

Value Notifier Plus #

License: MIT

ValueNotifierPlus #

ValueNotifierPlus é um pacote que expande as funcionalidades de ValueNotifier do Flutter, oferecendo uma alternativa ao Cubit utilizando ValueNotifier em vez de Streams.ValueNotifier é mais eficiente em termos de desempenho porque não precisa lidar com a complexidade de um sistema de fluxo assíncrono. Isso pode ser importante em cenários de alta frequência de atualização de UI. Ele inclui suporte para observadores, múltiplos listeners e widgets helpers, como ValueNotifierPlusBuilder, ValueNotifierPlusListener, ValueNotifierPlusConsumer e MultiValueNotifierPlusListener.

Instalação #

Adicione o ValueNotifierPlus ao seu arquivo pubspec.yaml:

dependencies:
  value_notifier_plus: x.x.x

Uso #

1. Criando um ValueNotifierPlus

import 'package:flutter/material.dart';
import 'value_notifier_plus.dart';

class CounterNotifier extends ValueNotifierPlus<int> {
  CounterNotifier() : super(0);

  void increment() => emit(state + 1);
  void decrement() => emit(state - 1);
}

2. Usando o ValueNotifierPlusProvider

import 'package:flutter/material.dart';
import 'value_notifier_plus.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return PlusProvider(
      provider: CounterNotifier(),
      child: MaterialApp(
        home: CounterPage(),
      ),
    );
  }
}

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterNotifier = context.of<CounterNotifier>();

    return Scaffold(
      appBar: AppBar(title: Text('ValueNotifierPlus Example')),
      body: Center(
        child: ValueNotifierPlusBuilder<CounterNotifier, int>(
          notifier: counterNotifier,
          builder: (context, state) {
            return Text('Counter: $state');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: counterNotifier.increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

3. Usando o ValueNotifierPlusListener

import 'package:flutter/material.dart';
import 'value_notifier_plus.dart';

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('ValueNotifierPlus Example')),
      body: Center(
        child: ValueNotifierPlusListener<CounterNotifier, int>(
          notifier: counterNotifier,
          listener: (context, state) {
            if (state == 10) {
              ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Reached 10!')));
            }
          },
          child: ValueNotifierPlusBuilder<CounterNotifier, int>(
            notifier: counterNotifier,
            builder: (context, state) {
              return Text('Counter: $state');
            },
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          ValueNotifierPlusProvider.of<CounterNotifier>(context).increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

4. Usando o ValueNotifierPlusConsumer

import 'package:flutter/material.dart';
import 'value_notifier_plus.dart';

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('ValueNotifierPlus Example')),
      body: Center(
        child: ValueNotifierPlusConsumer<CounterNotifier, int>(
          notifier: counterNotifier,
          listener: (context, state) {
            if (state == 10) {
              ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Reached 10!')));
            }
          },
          builder: (context, state) {
            return Text('Counter: $state');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.of<CounterNotifier>().increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

5. Usando o MultiValueNotifierPlusListener

import 'package:flutter/material.dart';
import 'value_notifier_plus.dart';

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('ValueNotifierPlus Example')),
      body: Center(
        child: MultiValueNotifierPlusListener(
          listeners: [
            ValueNotifierPlusListener<CounterNotifier, int>(
              listener: (context, state) {
                if (state == 5) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Reached 5!')));
                }
              },
              notifier: counterNotifier,
              child: Container(),
            ),
            ValueNotifierPlusListener<CounterNotifier, int>(
              listener: (context, state) {
                if (state == 10) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Reached 10!')));
                }
              },
              notifier: counter,
              child: Container(),
            ),
          ],
          child: ValueNotifierPlusBuilder<CounterNotifier, int>(
            notifier: counter,
            builder: (context, state) {
              return Text('Counter: $state');
            },
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.of<CounterNotifier>().increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

Observador #

Você pode adicionar um observador para monitorar mudanças de estado nos ValueNotifierPlus:

import 'package:flutter/material.dart';
import 'value_notifier_plus.dart';

class MyObserver extends ValueNotifierPlusObserver {
  @override
  void onChange<ValueNotifierPlusType extends ValueNotifierPlus>(
    ValueNotifierPlusType notifier,
    Object? state,
  ) {
    print('State changed to $state');
  }
}

void main() {
  ValueNotifierPlus.observer = MyObserver();
  runApp(MyApp());
}

Testes #

Para rodar os testes, execute o seguinte comando no terminal:

flutter test

Contribuições #

Contribuições são bem-vindas! Por favor, abra um pull request ou uma issue no GitHub se encontrar algum problema ou tiver sugestões de melhorias.

Licença #

Este projeto está licenciado sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.