【问题标题】:Flutter: BloC: SubBloC doesn't change when reordering listFlutter:BloC:重新排序列表时SubBloC不会改变
【发布时间】:2021-10-05 05:55:55
【问题描述】:

在使用带有 BloC 的列表视图时,我似乎有一个错误的想法。

我有一个由 BloC (dataBloc) 填充的列表视图,该列表由 ViewBloc 排序。 当我点击该项目时,会更新 SubDataBloc 并将结果显示在列表磁贴的尾部

数据块/视图块:

  • ListTileA - SubdataBlocA
  • ListTileB - SubDataBlocB
  • ListTileC - SubDataBlocC

当我重新排序列表时 - 只有 ListTiles 被重新排序,而不是 SubdataBloc 结果 视频: https://gitlab.com/bridystone/bloc_test/-/blob/main/BloC-ListTile.mov

整个例子在这里: https://gitlab.com/bridystone/bloc_test

任何想法,关于如何实现这一点?

ListView.builder

      body: BlocBuilder<ViewBloc, ViewState>(
        builder: (context, state) {
          if (state is ViewInitial) {
            return CircularProgressIndicator();
          } else if (state is ViewReadyForUI) {
            return ListView.builder(
              itemCount: state.sortedData.length,
              itemBuilder: (context, index) => BlocProvider(
                create: (context) => SubDataBloc(),
                child: MyTile(
                  dataItem: state.sortedData[index],
                ),
              ),
            );
          }
          return Text('should not happen');
        },
      ),

ListTile:

 Widget build(BuildContext context) {
    //BlocProvider.of<SubDataBloc>(context).add(SubDataRequest(dataItem.id));
    return BlocBuilder<SubDataBloc, SubDataState>(
      builder: (context, state) {
        return ListTile(
          leading: Text(dataItem.id.toString()),
          title: Text(dataItem.text),
          trailing: (state is SubDataReceived)
              ? Text('items: ${state.subdata.length}')
              : (state is SubDataUpdating)
                  ? Text('${state.percent}')
                  : Text('initial'),
          onTap: () => BlocProvider.of<SubDataBloc>(context)
              .add(SubDataRequest(dataItem.id)),
        );
      },
    );
  }

【问题讨论】:

    标签: flutter bloc


    【解决方案1】:

    我收到了来自 Github/Bloc_library 的评论,这让我找到了解决方案。 我已将 SubdataBloc 转移到 MainBloc 的 dataModel。 所以对于每一个数据,都会存储一个对应的SubBloc。

    我现在已将 subDataBloc 添加到 DataModel

    class BlocModel {
      final Model model;
      SubDataBloc subDataBloc;
    
      BlocModel(this.model, this.subDataBloc);
    }
    

    并在生成过程中将 BloC 添加到模型中

        var modelData = List<BlocModel>.generate(
            event.requestId,
            (index) => BlocModel(
                Model(Random().nextInt(event.requestId), "BLABLABLA $index"),
                SubDataBloc())); // <-- added here
    
    

    然后我可以使用 bloc 属性将子块添加到 BlocBuilder

        return BlocBuilder<SubDataBloc, SubDataState>(
          bloc: dataItem.subDataBloc,      //<-- using the data model-BloC
          builder: (context, state) {
            return ListTile(
                leading: Text(dataItem.model.id.toString()),
                title: Text(dataItem.model.text),
                trailing: (state is SubDataReceived)
                    ? Text('items: ${state.subdata.length}')
                    : (state is SubDataUpdating)
                        ? Text('${state.percent}')
                        : Text('initial'),
                onTap: () =>
                    dataItem.subDataBloc.add(SubDataRequest(dataItem.model.id)));
          },
        );
    

    现在它以intended 的身份工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2019-04-17
      • 1970-01-01
      • 2019-09-18
      • 2015-11-25
      • 1970-01-01
      • 2023-02-21
      相关资源
      最近更新 更多