
Ayer, mi buen amigo dijo algo como "Estoy escribiendo una aplicaci贸n simple fuera de l铆nea, no necesito todas estas transmisiones y transmisiones". Incluso me sorprendi贸, y luego pens茅 que otros codificadores podr铆an compartir este error.
A continuaci贸n, literalmente en 50 l铆neas, mostrar茅 con un ejemplo bien conocido que la reactividad
a) no se trata de fuera de l铆nea / en l铆nea
b) es muy simple
c) muy bueno para simplificar casi cualquier c贸digo
A mis apresurados cr铆ticos
que se apresuran a la batalla sin pensar, considerando que BlocProvider
es un proveedor , recomiendo para el desarrollo general que lea primero el art铆culo b谩sico , un enlace al que se encuentra en la p谩gina flutter_bloc, en la primera l铆nea de la descripci贸n.
El conocido ejemplo "Contador" que se genera al crear un proyecto Flutter es chico de azotes Un buen punto de partida para demostrar muchas pr谩cticas.
Por lo tanto, contiene MyHomePage extends StatefulWidget
, el m茅todo _incrementCounter
para el comando de incremento y setState
para volver a dibujar toda la jerarqu铆a de widgets.
Introducimos la reactividad usando la biblioteca rxdart
y algunos pasos simples:
Agregue la biblioteca a pubspec.yaml
dependencies: ... rxdart: 0.22.2
Cambiar la arquitectura del contador y agregar evento
class _Counter { int _count; int get count => _count; _Counter(this._count) : this.onCounterUpd = BehaviorSubject<int>.seeded(_count);
Envuelva el widget de visualizaci贸n en StreamBuilder y cambie la llamada al m茅todo de incremento
StreamBuilder<int>( stream: _counter.onCounterUpd, builder: (context, snapshot) { return Text( '${snapshot.data}', style: Theme.of(context).textTheme.display1, ); }), ... floatingActionButton: FloatingActionButton( onPressed: _counter.incrementCounter, ...
Eso es todo Se ve totalmente as铆
import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:rxdart/rxdart.dart'; class _Counter { int _count; int get count => _count; _Counter(this._count) : this.onCounterUpd = BehaviorSubject<int>.seeded(_count);
Ahora el c贸digo es reactivo, conciso, libre de redibujos innecesarios y f谩cilmente extensible.
Por ejemplo, si en el momento de cambiar el contador necesita cambiar el texto de otro widget, simplemente haga esto:
StreamBuilder<int>( stream: onCounterUpd, builder: (context, snapshot) { return Text( 'You have pushed the button ${snapshot.data} times:', ); }),
y voila!

A modo de comparaci贸n, intente hacer lo mismo con InheritedWidget u otro patr贸n.
Entonces, con suerte, mostr茅 que
- La reactividad es muy simple.
BlocProvider
InheritedWidgets
mucho m谩s f谩ciles, BlocProvider
, etc. - La reactividad no se trata fuera de l铆nea / en l铆nea. Ella es sobre arquitectura. Como he mostrado, en los casos m谩s simples ni siquiera necesita agregar clases adicionales para aplicarlo.
- La reactividad es UI receptiva, extensi贸n r谩pida de funcionalidad, separaci贸n elegante de c贸digo en capas de cualquier tipo: MVC, MVP, MVI, MVVM, lo que quieras.
C贸digo de ejemplo (rama iter_0004_rxdart
)
Editado una hora despu茅s
En vano lo hizo demasiado simple, obtuve clics para "variables globales" y una comprensi贸n err贸nea de BehaviorSubject
inicializaci贸n de BehaviorSubject
, corregido