首页 > 解决方案 > 如何将未来的结果与颤动的流联系起来?

问题描述

我试图从数据库中获取数据并使用流将该数据传输到屏幕。我使用FutureBuilder该解决方案完成了这项工作,但我需要使用streambuilder Can有人帮我找到问题。我有一种从数据库中获取数据的方法

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,);
        }
      },
    );
  }

但数据没有出现在屏幕上

我已经尝试过这个解决方案,但没有机会!

谁能帮我将未来的结果转换为流?

谢谢。

标签: dartflutterstreamfuture

解决方案


实现这一目标的一种简单方法是await为将来完成,然后将数据放入流中。

在您的集团课程中:

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

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

推荐阅读