美文网首页
ListView GridView 嵌套-学习笔记

ListView GridView 嵌套-学习笔记

作者: 天往哪方 | 来源:发表于2020-06-18 13:39 被阅读0次
import 'dart:math';

import 'package:flutter/material.dart';

main() => runApp(Demo01App());

class Demo01App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RootPage();
  }
}

class RootPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("多列表"),
      ),
      body: BodyPage(),
    );
  }
}

class BodyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: CustomScrollView(
        slivers: <Widget>[
          CustomGridView(),
        ],
      ),
    );
  }
}

class CustomGridView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverGrid(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisSpacing: 8,
            mainAxisSpacing: 8,
            childAspectRatio: 1.5,
            crossAxisCount: 2),
        delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
          return Container(
            color: Color.fromARGB(255, Random().nextInt(255),
                Random().nextInt(255), Random().nextInt(255)),
            child: Text("我是第$index个"),
          );
        }, childCount: 100));
  }
}

问题一、
当组件在安全区域并且没有 APPbar 的时候,listview 或者 GridView 并不能在上滑的时候将最上面的 Item,顶到屏幕最上面之后再消失,只能在安全区域内的最上面部分消失

所以,这种情况下最好是给SliverGrid 组件包裹 SliverSafeArea 组件

问题二、
需求上想给ListView 或者 GridView 的 Item 加上下左右边距,同时 ListView 或者 GridView 的最上面的 Item 距离最上面同样加上边距。
这时候是不能给 Item、ListView、GridView 加 Padding 或者加 Container(padding)等属性的,因为如果加这些组件的话,会出现ListView 或者 GridView 向上滚动的时候,最上面的边距会一直存在

解决方法:给 SliverGrid 组件添加一层SliverPadding 组件进行包裹

最终效果

import 'dart:math';

import 'package:flutter/material.dart';

main() => runApp(Demo01App());

class Demo01App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RootPage();
  }
}

class RootPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
//      appBar: AppBar(
//        title: Text("多列表"),
//      ),
      body: BodyPage(),
    );
  }
}

class BodyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        /**
         * 这里的SliverAppBar 会自带一个 NavigationBar,所以如果一个页面如果有 SliverAppBar,Scaffold 的 AppBar可以不用了
         *  - pinned:这个属性是设定 SliverAppBar 的 NavigationBar 是否随滚动向上隐藏,默认为 true(隐藏),如果不需要设置为 false
         *  - expandedHeight:设置 NavigationBar 的高度
         *  - flexibleSpace:值一般为FlexibleSpaceBar对象,图片、文字等都是设置FlexibleSpaceBar的属性得到的
         *      FlexibleSpaceBar
         *        - title:NavigationBar 的标题
         *        - background:这是一个Widget,可以随意传想要展示的组件进去
         */
        SliverAppBar(
          expandedHeight: 300,
          flexibleSpace: FlexibleSpaceBar(
            title: Text("Hello Word"),
            background: Image.network("https://dss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2514175862,3346224610&fm=26&gp=0.jpg",fit: BoxFit.cover,),
          ),
          pinned: true,
        ),
        sliverGridItem(),
        sliverLIstItem()
      ],
    );
  }
}

class sliverLIstItem extends StatelessWidget {
  const sliverLIstItem({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SliverList(
        delegate: SliverChildBuilderDelegate((BuildContext ctx, int index) {
      return ListTile(
        leading: Icon(Icons.people),
        title: Text("联系人$index"),
      );
    }, childCount: 10));
  }
}

class sliverGridItem extends StatelessWidget {
  const sliverGridItem({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SliverGrid(
        delegate: SliverChildBuilderDelegate((BuildContext ctx, int index) {
          return Container(
            color: Color.fromARGB(255, Random().nextInt(255),
                Random().nextInt(255), Random().nextInt(255)),
            child: Text("我是第$index个"),
          );
        }, childCount: 10),
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisSpacing: 8,
            crossAxisCount: 2,
            mainAxisSpacing: 8,
            childAspectRatio: 1.5));
  }
}

class CustomScrollViewSliverGridView extends StatelessWidget {
  const CustomScrollViewSliverGridView({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SliverSafeArea(
      top: false,
      sliver: SliverPadding(
        padding: EdgeInsets.only(top: 10),
        sliver: SliverGrid(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisSpacing: 8,
                mainAxisSpacing: 8,
                childAspectRatio: 1.5,
                crossAxisCount: 2),
            delegate:
                SliverChildBuilderDelegate((BuildContext context, int index) {
              return Container(
                color: Color.fromARGB(255, Random().nextInt(255),
                    Random().nextInt(255), Random().nextInt(255)),
                child: Text("我是第$index个"),
              );
            }, childCount: 100)),
      ),
    );
  }
}

QQ20200618-133925-HD.gif

相关文章

网友评论

      本文标题:ListView GridView 嵌套-学习笔记

      本文链接:https://www.haomeiwen.com/subject/xnvyxktx.html