【问题标题】:Lazy scrolling with silvers银子懒惰滚动
【发布时间】:2021-03-11 20:35:24
【问题描述】:

当我的所有页面都滚动时,我想要延迟滚动,所以我必须使用自定义滚动视图。 现在 CustomScrollView 可以只有银子,我的问题是有很多列表和小部件, 具有自己的列表的扩展小部件。 为了实现最好的惰性滚动,我必须了解如何进入我所有列表的顶级小部件,这可能会变得非常讨厌。 LeagueGamesList 小部件包含扩展小部件的列表,每个扩展小部件都是一个列表。 我怎样才能做到并仍然保持秩序和维护小部件?

   SliverList(
              delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
                return Container(
                  padding: EdgeInsets.only(left: 15),
                  child: Column(
                    children: <Widget>[
                      if (_highlights.length > 0)
                        Column(
                          children: [
                            Container(
                              child: Align(
                                alignment: Alignment.centerLeft,
                                child: Padding(
                                  padding: const EdgeInsets.symmetric(vertical: 15),
                                  child: Row(
                                    children: [
                                      Text(
                                        'Highlights',
                                        style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),
                                      ),
                                      Image.asset(
                                        AppIcons.rightArrow,
                                        alignment: Alignment.center,
                                        width: 20,
                                        height: 20,
                                      )
                                    ],
                                  ),
                                ),
                              ),
                            ),
                            Container(
                              child: Align(
                                alignment: Alignment.centerLeft,
                                child: HighlightRow(highlights: _highlights),
                              ),
                            ),
                          ],
                        ),
                      Visibility(
                        visible: _advertisements.length != 0,
                        child: Padding(
                          padding: EdgeInsets.only(right: 15),
                          child: HomepageBanner(
                            advertisement: _homepageAdvertisement,
                          ),
                        ),
                      ),
                      if (Provider.of<ArticlesProvider>(context).get().length > 0)
                        HomepageArticles(
                          articles: Provider.of<ArticlesProvider>(context).get(),
                        ),
                    ],
                  ),
                );
              }, childCount: 1),
            ),
            SliverList(
              delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
                return Column(
                  children: [
                    Visibility(
                      visible: isLoading,
                      child: SpinKitFadingCircle(
                        color: Colors.black,
                        size: 20,
                      ),
                      replacement: SizedBox(height: 20),
                    ),
                    DateButton(
                      dateString: getDateString(),
                      dayForwards: dayForwards,
                      dayBackwards: dayBackwards,
                    ),
                    SizedBox(height: 20),
                  ],
                );
              }, childCount: 1),
            ),
            SliverList(
              delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
                print(index);
                return LeagueGamesList(
                  leagueFixture: leagueFixtures[index],
                  closeExpanders: false,
                  openExpanders: isDateChanged,
                  rowHeight: rowHeight,
                );
              }, childCount: leagueFixtures.length),
            ),
          ],
        )

我的扩展容器将包含一个列表

class ExpandableContainer extends StatelessWidget {
  final bool expanded;
  final double collapsedHeight;
  final double expandedHeight;
  final Widget child;

  ExpandableContainer({
    @required this.child,
    this.collapsedHeight = 0.0,
    this.expandedHeight = 0,
    this.expanded = true,
  });

  @override
  Widget build(BuildContext context) {
    double screenWidth = MediaQuery.of(context).size.width;
    return new AnimatedContainer(
      duration: new Duration(milliseconds: 500),
      curve: Curves.easeInOut,
      width: screenWidth,
      height: expanded ? expandedHeight : collapsedHeight,
      padding: EdgeInsets.all(0),
      margin: EdgeInsets.all(0),
      alignment: Alignment.topLeft,
      child: child,
    );
  }

【问题讨论】:

    标签: flutter


    【解决方案1】:

    不要在列表中嵌套列表,而是只让最深的列表成为实际的SliverLists,并使用我的包sliver_tools中的MultiSlivers 将它们组合在一起@

    【讨论】:

    • 我做不到我有几个列表和小部件不在列表中我必须在单个可滚动页面下包含所有这些
    • 抱歉误读了代码,我更新了答案
    • 我试试看,它可以处理扩展列表吗?现在,当我打印索引时,我的构建器构建了 2 个扩展列表而不是 16 个
    • expanded list 到底是什么意思?
    • 动画容器,当被点击打开并包含一个列表时,我添加了我的扩展容器,当我滚动它时它在开始时打开,我有机会关闭它,所以懒惰真的很棘手滚动这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2022-01-09
    • 2012-06-02
    相关资源
    最近更新 更多