dart - 如何将未来的结果与颤动的流联系起来?
问题描述
我试图从数据库中获取数据并使用流将该数据传输到屏幕。我使用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,);
}
},
);
}
但数据没有出现在屏幕上
我已经尝试过这个解决方案,但没有机会!
谁能帮我将未来的结果转换为流?
谢谢。
解决方案
实现这一目标的一种简单方法是await
为将来完成,然后将数据放入流中。
在您的集团课程中:
void _init() async {
List<CementSandAggregateView> data = await provider.getAllRatios();
_cSAMixController.add(data);
}
CementSandAggregateMixBloC(){
provider = new BLoCProvider();
_cSAMixController = BehaviorSubject< List<CementSandAggregateView> >();
_init();
}