Blo c шаблонные геттеры - PullRequest
       3

Blo c шаблонные геттеры

0 голосов
/ 15 марта 2020

Я пытаюсь использовать шаблон blo c правильно, но не могу найти хороших примеров правильного использования геттеров. То, что мне нужно, это один поток, но способ вернуть отфильтрованные данные из моего хранилища на основе параметров et c. Я не думаю, что это хорошая идея, чтобы добавить целые новые потоки только для этого, и хотел бы поработать, если то, что я делаю, противоречит лучшей практике или нет (похоже, это работает).

UI:

StreamBuilder(
              stream: _bloc.stream,
              initialData: _bloc.state.initialData,
              builder: (BuildContext context, AsyncSnapshot<CounterState> snapshot) {
                return Row(
                  children: <Widget>[
                    Text(snapshot.data.counter.toString()),
                    Text(snapshot.data.sayHi('Bob')),
                  ],
                );
              },
            ),

Blo c:

import 'dart:async';
import 'package:flutter/cupertino.dart';

import './counter_event.dart';
import './counter_state.dart';

@immutable
class CounterBloc {
  final state = new CounterState();

  final _counterStateController = StreamController<CounterState>();

  // Only expose the out
  StreamSink<CounterState> get _inCounter => _counterStateController.sink;

  Stream<CounterState> get stream => _counterStateController.stream;

  // only expose the in
  final _counterEventController = StreamController<CounterEvent>();

  Sink<CounterEvent> get counterEventSink => _counterEventController.sink;

  // listen to the output
  CounterBloc() {
    _counterEventController.stream.listen(_mapEventToState);
  }

  void _mapEventToState(CounterEvent event) {
    final res = state.mapEventToState(event);
    _inCounter.add(res);
  }

  void dispose() {
    _counterStateController.close();
    _counterEventController.close();
  }
}

События:

import 'package:flutter/cupertino.dart';

@immutable
abstract class CounterEvent {}

class IncrementEvent extends CounterEvent {}
class DecrementEvent extends CounterEvent {}

Состояние:

import 'counter_event.dart';

class CounterState {
  int _counter = 0;

  CounterState get initialData => this;

  int get counter => _counter;

  CounterState mapEventToState(CounterEvent event) {
    if (event is IncrementEvent) {
      _counter++;
    } else if (event is DecrementEvent) {
      _counter--;
    }

    print(_counter.toString());

    return this; // @TODO - IS THIS OK ??
  }

  // @TODO - Is this the correct place for this to go? (filtering of _counter data)
  String sayHi(String name) {
    return 'HI $name ' + _counter.toString();
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...