问题描述
我要使用cubit来从FireStore检索物品和拾取图像。
Cubit:
class ItemCubit extends Cubit<ItemState> {
ItemCubit(this._dataBase)
: super(ItemInitial());
final DataBase _dataBase;
StreamSubscription streamSubscription;
Future<void> pickItemImg() async {
final currentTempImg =
await ImagePickerWeb.getimage(outputType: ImageType.bytes);
emit(ItemImgPicked(currentTempImg));
}
Future getItem() async {
streamSubscription = _dataBase.getItem().listen((data) {
emit(Itemloaded(data));
});
}
}
状态:
@immutable
abstract class ItemState {}
class Itemloaded extends ItemState {
final List<Item> item;
Itemloaded(this.item);
}
class ItemImgPicked extends ItemState {
final Uint8List currentTempImg;
ItemImgPicked(this.currentTempImg);
}
带有blocbuilders的页面
class Page extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
RaisedButton(
onpressed: () async {
showDialog(
context: context,builder: (BuildContext context) => Dialog(
child: Container(
width: 400,child: OutlineButton(
onpressed: () async {
context.bloc<ItemCubit>().pickProductImg();
},child: BlocBuilder<ItemCubit,ItemState>(
builder: (context,state) {
if (state is ItemImgPicked) {
return Image.memory(state.currentTempImg);
} else {
return Container();
}
},),);
},child: Text('add'),BlocBuilder<ItemCubit,ItemState>(
builder: (context,state) {
if (state is Itemloaded) {
return Column(
children: state.item.map(
(item) {
return Text(item.name);
},).toList(),);
}
return CircularProgressIndicator();
},)
],);
}
}
问题是在显示对话框中我选择图像时,显示了选择的图像,但同时在blocbuilder主页上,项目列表返回CircularProgressIndicator
。如果我此时使用热重装,则它会显示项目列表。看起来像是项目列表的拾取图像替换状态。如何解决?
解决方法
您的主页集团构建器会监听ItemLoaded
,据我所知您从未发出过。您可以在该行中放置一个断点,而不会被命中。
也就是说,请更好地对待您的async
函数,您错过了等待某些期货的机会,这也许现在不是您的问题,但是迟早会成为问题。