SliverList 和 Getx StateMixin 支持

Posted

技术标签:

【中文标题】SliverList 和 Getx StateMixin 支持【英文标题】:SliverList and Getx StateMixin support 【发布时间】:2021-04-07 09:12:40 【问题描述】:

我正在努力使GetxControllerSliverList 一起工作。特别是,我的控制器从Getx library 返回带有StateMixin 的视图状态。

class ItinerariesByCreatorPageController extends GetxController
    with StateMixin<Pair<Creator, List<Itinerary>>> 
  ItinerariesByCreatorPageController(this._interactor);

  final ItinerariesInteractor _interactor;

  void getCreatorPage(String creatorSlug, String language) 
    _interactor
        .getItinerariesByCreatorSlug(creatorSlug, language)
        .then((value) => change(value, status: RxStatus.success()))
        .onError<String>((error, stackTrace) =>
            change(null, status: RxStatus.error(error.toString())));
  

在视图方面,我使用obx 扩展来观察控制器状态并使用SliverList 来显示数据。不幸的是,SliverList 委托 SliverChildBuilderDelegate 需要在其构造函数中提供列表 childCount,但子计数来自控制器异步,我无法在 Getx 文档中找到以反应方式返回子计数的方法.有没有办法让SliverListGetx 一起工作?

Widget _getItinerariesList() 
    return SliverList(
        delegate: SliverChildBuilderDelegate(
            (context, index) => _controller.obx((data) 
                  if (index == 0) 
                    return CreatorInfoWidget(
                      creator: data.first,
                      imageWidget: CreatorImageWidget(
                        imageUrl: data.first.avatars.first,
                      ),
                    );
                   else if (index == 1) 
                    return MainItineraryWidget(
                        creator: data.first, itinerary: data.second[index - 1]);
                   else 
                    return SecondaryItineraryWidget(
                        creator: data.first, itinerary: data.second[index - 1]);
                  
                ),
            childCount: 5 // use a dynamic child count here, coming from the controller));
  

【问题讨论】:

【参考方案1】:

你可以在SliverList上方移动controller.obx

Widget _getItinerariesList() 
return _controller.obx((data) 
  return SliverList(
        delegate: SliverChildBuilderDelegate(
        (context, index)
              if (index == 0) 
                return CreatorInfoWidget(
                  creator: data.first,
                  imageWidget: CreatorImageWidget(
                    imageUrl: data.first.avatars.first,
                  ),
                );
               else if (index == 1) 
                return MainItineraryWidget(
                    creator: data.first, itinerary: data.second[index - 1]);
               else 
                return SecondaryItineraryWidget(
                    creator: data.first, itinerary: data.second[index - 1]);
              
            ),
        childCount: data.yourCountVariable // use a dynamic child count here, coming from the controller));
   

【讨论】:

以上是关于SliverList 和 Getx StateMixin 支持的主要内容,如果未能解决你的问题,请参考以下文章

flutter系列之:使用SliverList和SliverGird

Flutter如何滚动到SliverList中的特定项目位置?

Flutter SliverAppBar 和 SliverList 有不同的滚动条

颤振 - SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引

Flutter-如何将标题添加到 SliverList 的 SliverChildBuilderDelegate?

在 Flutter 中重叠 SliverList 子项