Как добиться вложенных лент? Лента, содержащая список лент

SliverList - лента, содержащая виджеты ящиков. Есть ли лента с виджетами ленты?

Я пытаюсь вложить flutter_sticky_headers для создания временной шкалы, но SliverStickyHeader принимает в качестве аргумента только один фрагмент (см. Комментарий в monthSlivers()).

class HomeView extends StatelessWidget {
  final HomeViewModel viewModel;

  HomeView(this.viewModel);

  List<Widget> entryTiles(List<EntryTileViewModel> entryVMs) {
    return entryVMs.map((entryVM) => EntryTile(viewModel: entryVM)).toList();
  }

  List<Widget> daySlivers(List<DaySection> daySections) {
    return daySections.map((daySection) {
      var entries = entryTiles(daySection.entryVMs);
      return SliverStickyHeader(
        overlapsContent: true,
        header: DayHeader(
          viewModel: DayHeaderViewModel(date: daySection.date),
        ),
        sliver: SliverList(
          delegate: SliverChildBuilderDelegate(
                (context, i) => entries[i],
            childCount: entries.length,
          ),
        ),
      );
    }).toList();
  }

  List<Widget> monthSlivers() {
    return viewModel.monthSections.map((monthSection) {
      var days = daySlivers(monthSection.daySections);
      return SliverStickyHeader(
        header: MonthHeader(
          viewModel: MonthHeaderViewModel(date: monthSection.date),
        ),
        sliver:,// THIS IS WHERE I WANT TO PUT DAYSLIVERS().
      );
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: CustomScrollView(
        slivers: monthSlivers(),
      ),
    );
  }
}

person Zach Foster    schedule 09.04.2020    source источник


Ответы (3)


Я использую это прямо сейчас в своих проектах


class SliverSection extends StatelessWidget {
  final List<Widget> slivers;

  const SliverSection({Key key, this.slivers}) : super(key: key);

  @override
  Widget build(BuildContext context) {
   return  SliverToBoxAdapter(
     child: ShrinkWrappingViewport(
       offset: ViewportOffset.zero(),
       slivers: slivers,
     ),
   );
  }
}

Я не пробовал, это влияет на производительность

person jamesblasco    schedule 23.04.2020

Вы можете использовать CustomScrollView() с осколками в качестве именованного параметра, который получает список осколков или NestedScrollView()

person Manish Patil    schedule 30.09.2020

Вы можете использовать пакет sliver_tools. В нем есть виджет под названием MultiSliver, с помощью которого можно достичь желаемого результата. Как упоминалось в документации:

Виджет MultiSliver позволяет группировать несколько лент вместе, чтобы их можно было вернуть как один виджет. Например, когда кто-то хочет обернуть несколько фрагментов отступом или унаследованным виджетом.

и это пример:

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiSliver(
      children: <Widget>[
        SliverPersistentHeader(...),
        SliverList(...),
      ],
    );
  }
}

или вы можете использовать его внутри CustomScrollView:

CustomScrollView(
  slivers:[
    MultiSliver(
      SliverList(...),
      SliverGrid(...),
      ...
    )
  ]
)
person Hossein Hadi    schedule 28.06.2021