首页 > 解决方案 > 如何为所有页面制作一个 CustomScrollView

问题描述

我有一个主页,根据模型的不同,它显示在CustomScrollView中,并 分割了其他页面。

例子:

CustomScrollView(
  physics: _bouncingScrollPhysics,
  controller: _scrollController,
  slivers: <Widget>[
    _pages[_selectedTab]
  ],
),

我不想CustomScrollView在每个页面上复制控制器和物理,所以这个解决方案对我来说似乎很实用。但是我遇到了这样一个问题,如果页面类返回,比如一个SliverList,那么一切正常,但是如果类需要返回多个呢?

 @override
 Widget build(BuildContext context) {
   return SliverList() //OK
 }

 @override
 Widget build(BuildContext context) {
   return ...[
     SliverList(),
     SliverList()
   ]; // NOT OK
}

标签: flutterdart

解决方案


创建用于存储条子信息的类

class SliverListInfo {
  final SliverAppBar sliverList;
  final SliverList sliverAppBar;
  SliverListInfo(this.sliverAppBar, this.sliverList);
}

在你想使用的State类里面StatefullWidgetCustomScrollView

class _SliverTestState extends State<SliverTest> {
  /// Selected tab pane
  int _selectedTab;

  /// List of sliver information
  final sliverLists = <SliverListInfo>[];

  @override
  void initState() {
    super.initState();
    // Populate items
    sliverLists.add(SliverListInfo(SliverAppBar(...),
      SliverList(delegate: SliverChildBuilderDelegate),
    )); // page 1
    sliverLists.add(SliverListInfo(SliverAppBar(...),
      SliverList(delegate: SliverChildListDelegate),
    )); // page 2
    ...
  }

  @override
  void build(BuildContext context) {
    return CustomScrollView(
      physics: _bouncingScrollPhysics,
      controller: _scrollController,
      slivers: sliverLists[_selectedTab],
    );
  }
}

PS Widget 可以像任何其他对象一样创建。build仅当小部件嵌入到小部件树中以对其进行可视化时才使用此功能。


推荐阅读