Как связать будущий результат с потоком во флаттере? - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь получить данные из базы данных и передать эти данные на экран с помощью потока.Я сделал это, используя FutureBuilder, решение работает в соответствии с ожиданиями, но мне нужно использовать streambuilder Может кто-нибудь помочь мне найти проблему.У меня есть метод, который получает данные из базы данных

Future<List<CementSandAggregateView>> getAllRatios() async{
   List<CementSandAggregateView> ratioList = new List();

    var types = await ratioRepository.getAll();
    for(int i = 0 ; i < types.length ; i ++){

      CementSandAggregateView view = new CementSandAggregateView();

      String cementRatio = types[i].cement.floor() < types[i].cement ? types[i].cement.toStringAsFixed(1):types[i].cement.toStringAsFixed(0);
      String sandRatio = types[i].sand.floor() < types[i].sand ? types[i].sand.toStringAsFixed(1):types[i].sand.toStringAsFixed(0);
      String aggregateRatio = types[i].aggregate.floor() < types[i].aggregate ? types[i].aggregate.toStringAsFixed(1):types[i].aggregate.toStringAsFixed(0);

      view.ratio = "$cementRatio:$sandRatio:$aggregateRatio (${types[i].name})";
      view.id = types[i].id;
      view.name = types[i].name;
      print(view.ratio);
      ratioList.add(view);
    }

    return ratioList;
  }

, и я хочу отправить эти данные, используя поток

class CementSandAggregateMixBloC {
    BehaviorSubject<Future<List<CementSandAggregateView>>> _cSAMixController;
    BLoCProvider provider;
  CementSandAggregateMixBloC(){
    provider = new BLoCProvider();
    _cSAMixController = new BehaviorSubject<Future<List<CementSandAggregateView>>>();

    _cSAMixController.add(provider.getAllRatios());
  }

  Observable<Future<List<CementSandAggregateView>>> inputObservable() => _cSAMixController.stream;

    void dispose() {
    _cSAMixController.close();
  }
}

на моем экране, я использую поток, используя streambuilder

Widget _buildBottomNavigationBar1() {
    List<BottomNavigationBarItem> items = List();

    return StreamBuilder(
      stream: _rationBloC.inputObservable(),
      builder: (context,
          AsyncSnapshot<Future<List<CementSandAggregateView>>> snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasData) {
            snapshot.data.then((onValue) => {
                  onValue.forEach((mix) => {})
                });

            return BottomNavigationBar(
                items: items,
                currentIndex: _selectedRatio,
                fixedColor: Theme.of(context).buttonColor,
                onTap: _onItemTapped);
          } else {
            return new Center(
              child: new CircularProgressIndicator(),
            );
          }
        } else {
          return new Container(width: 0.0,height: 0.0,);
        }
      },
    );
  }

но данные не приходят на экран

я пробовал это решение но нет шансов!

может кто-нибудь помочь мне преобразовать будущий результат в поток?

Спасибо.

1 Ответ

1 голос
/ 23 мая 2019

Простой подход для достижения этой цели - await на будущее, а затем поместить данные в ваш поток.

В классе вашего блока:

void _init() async {
   List<CementSandAggregateView> data = await provider.getAllRatios();
   _cSAMixController.add(data);
}

CementSandAggregateMixBloC(){
    provider = new BLoCProvider();
    _cSAMixController = BehaviorSubject< List<CementSandAggregateView> >();
    _init();
  }
...