如何将未来的结果与颤振中的流联系起来?
How to connect future result with stream in flutter?
我正在尝试从数据库中获取数据并使用流将该数据传输到屏幕。
我使用 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,);
}
},
);
}
但是数据没有出现在屏幕上
我试过这个但没机会!
谁能帮我把未来的结果转换成流媒体?
谢谢。
实现此目的的一个简单方法是 await
为将来完成,然后将数据放入您的流中。
在你的圈子里 class:
void _init() async {
List<CementSandAggregateView> data = await provider.getAllRatios();
_cSAMixController.add(data);
}
CementSandAggregateMixBloC(){
provider = new BLoCProvider();
_cSAMixController = BehaviorSubject< List<CementSandAggregateView> >();
_init();
}
我认为 _init()
应该在 StatefulWidget
的 initState()
方法中调用,或者在 initState
或 build
方法中使用此代码。
WidgetBinding.instance.addPostFrameCallback(() => _init());
这意味着在渲染第一帧之后即调用该过程,即在 build
.
之后
我正在尝试从数据库中获取数据并使用流将该数据传输到屏幕。
我使用 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,);
}
},
);
}
但是数据没有出现在屏幕上
我试过这个
谁能帮我把未来的结果转换成流媒体?
谢谢。
实现此目的的一个简单方法是 await
为将来完成,然后将数据放入您的流中。
在你的圈子里 class:
void _init() async {
List<CementSandAggregateView> data = await provider.getAllRatios();
_cSAMixController.add(data);
}
CementSandAggregateMixBloC(){
provider = new BLoCProvider();
_cSAMixController = BehaviorSubject< List<CementSandAggregateView> >();
_init();
}
我认为 _init()
应该在 StatefulWidget
的 initState()
方法中调用,或者在 initState
或 build
方法中使用此代码。
WidgetBinding.instance.addPostFrameCallback(() => _init());
这意味着在渲染第一帧之后即调用该过程,即在 build
.