Flutter Cubit网站

问题描述

我要使用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函数,您错过了等待某些期货的机会,这也许现在不是您的问题,但是迟早会成为问题。