gpt4 book ai didi

dart - 如何将 future 的结果与 flutter 中的流联系起来?

转载 作者:IT王子 更新时间:2023-10-29 07:19:37 25 4
gpt4 key购买 nike

我正在尝试从数据库中获取数据并使用流将该数据传输到屏幕。我使用 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,);
}
},
);
}

但是数据没有出现在屏幕上

我试过这个solution但没有机会!

谁能帮我把 future 的结果转换成流媒体?

谢谢。

最佳答案

实现此目的的一种简单方法是 await 等待 future 完成,然后将数据放入您的流中。

在你的 bloc 类中:

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

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

关于dart - 如何将 future 的结果与 flutter 中的流联系起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56263900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com