精华内容
参与话题
问答
  • Flutter listview

    2019-05-15 09:47:42
    ListView 列表组件 使用了ListView,然后在他的内部children中,使用了widget数组,因为是一个列表,所以它接受一个数组,然后...import 'package:flutter/material.dart'; void main () => runApp(MyApp()); ...

    ListView 列表组件

    • 使用了ListView,然后在他的内部children中,使用了widget数组,因为是一个列表,所以它接受一个数组,然后有使用了listTite组件(列表瓦片),在组件中放置了图标和文字。

    • 放入图标和文字

    import 'package:flutter/material.dart';
    void main () => runApp(MyApp());
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context){
        return MaterialApp(
          title: 'Hello world',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter')
            ),
            body: new ListView(
              children:<Widget>[
                new ListTile(
                  leading:new Icon(Icons.access_time),
                  title:new Text('access_time')
                ),
                new ListTile(
                  leading:new Icon(Icons.account_balance),
                  title:new Text('account_balance')
                ),
              ]
            ),
          ),
        );
      }
    }
    
    
    • 放入多个图片
    import 'package:flutter/material.dart';
    void main () => runApp(MyApp());
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context){
        return MaterialApp(
          title: 'Hello world',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter')
            ),
            body: new ListView(
              children:<Widget>[
                new Image.network(
                 'http://pic.58pic.com/58pic/15/11/51/20E58PICNs4_1024.jpg'
                ),
                new Image.network(
                 'http://pic.58pic.com/58pic/15/11/51/20E58PICNs4_1024.jpg'
                ),
              ]
            ),
          ),
        );
      }
    }
    
    展开全文
  • flutter ListView

    2019-12-06 15:21:17
    踩坑1:使用ListView,外面包了一层 child: Column( children: <Widget>[ _projectList("上海东方有线", "销售负责人:万海"), ], ), 报很多错误,会报错而且页面展示不出来,原因是大...
    踩坑1:使用ListView,外面包了一层 child: Column(
                      children: <Widget>[
                        _projectList("上海东方有线", "销售负责人:万海"),
                      ],
                    ),
    报很多错误,会报错而且页面展示不出来,原因是大概是包了column,
    
    _projectList是自定义的
     // 列表
      Widget _projectList3(context1, context2) {
          print('--------------------1------------'+context1);
        return Container(
          width: ScreenUtil().setWidth(750),
          alignment: Alignment.centerLeft,
          child: ListView.builder(
            itemCount: 20,
            itemBuilder: (context, index) {
              return new Container(
                child: new Column(
                  children: <Widget>[
                    ListTile(
                        isThreeLine: true,
                        dense: false,
                        // leading: new CircleAvatar(child: new Text(item),),
                        title: new Text(context1),
                        subtitle: new Text(context2),
                        trailing: new Text(
                          '未跟进',
                          style: TextStyle(color: Colors.blue),
                        ),
                        onTap: () {}),
                    new Divider()
                  ],
                ),
              );
            },
          ),
        );
      }
    解决方案:
      child: Container(
    
                   child:_projectList("上海东方有线", "销售负责人:万海"),
    )
    
    展开全文
  • Flutter ListView

    2020-06-19 16:01:45
    ListView是最常用的滑动组件 构建ListView ListView(): 在item每没有出现在屏幕就会创建,性能开销比较大,可能会引起卡顿,所以不适合长列表 ListView.build(): 最长使用的列表 **ListView.separated():**处理分割...

    ListView是最常用的滑动组件

    构建ListView

    ListView(): 在item每没有出现在屏幕就会创建,性能开销比较大,可能会引起卡顿,所以不适合长列表
    ListView.build(): 最长使用的列表
    **ListView.separated():**处理分割线

    1.ListView()基础构造

     @override
      Widget build(BuildContext context) {
        return Container(
          height: 200,
          child: ListView(
            children: data
                .map((color) => Container(
              alignment: Alignment.center,
              width: 100,
              height: 50,
              color: color,
            ))
                .toList(),
          ),
        );
      }
    

    构造属性

    在这里插入图片描述

    • scrollDirection :列表的滚动方向 Axis的horizontal和vertical分为横向和竖直 默认是竖直
    • reverse :是否翻转 默认是不反转
    • ScrollController: 用来控制滚动位置及监听滚动事件
    • primary : primary为true时,我们的ScrollController 无效
    • ScrollPhysics 用来控制滑动的效果的(AlwaysScrollableScrollPhysics() ,NeverScrollableScrollPhysics(),BouncingScrollPhysics(),ClampingScrollPhysics())
    • shrinkWrap: 是否根据子widget的总长度来设置ListView的长度,该属性将决定列表的长度是否仅包裹其内容的长度。当ListView嵌在一个无限长的容器组件中时,shrinkWrap必须为true
    • itemExtent :子元素长度。当列表中的每一项长度是固定的情况下可以指定该值,有助于提高列表的性能(因为它可以帮助ListView在未实际渲染子元素之前就计算出每一项元素的位置);
    • cacheExtent: 预渲染区域长度,预加载的区域。ListView会在其可视区域的两边留一个cacheExtent长度的区域作为预渲染区域(对于ListView.build或ListView.separated构造函数创建的列表,不在可视区域和预渲染区域内的子元素不会被创建或会被销毁),设置预加载的区域 cacheExtent 强制设置为了 0.0,从而关闭了“预加载”;
    • addAutomaticKeepAlives:该字段表示是否将列表项包裹在AutomaticKeepAlive Widget中,默认为true,效果就是,列表子widget滑出可见视图时,其状态还会被保持,数据还会保持,并且列表项不会被GC掉
    • addRepaintBoundaries:表示是否将列表项包裹在RepaintBoundary中,默认为true,如果包裹则列表项不会重绘

    2. ListView.builder构建

    构造属性在这里插入图片描述

    • itemCount: 列表中元素的数量,如果为null,则表示无限列表
    • itemBuilder: 子元素的渲染方法,允许自定义子元素组件。列表项的构建器,类型为IndexedWidgetBuilder,返回值为一个widget(就是一个组件)。
      当列表滚动到具体的index位置时,会调用该构建器构建列表项,也就是所谓的基于Sliver的懒加载模型。
    • itemExtent:children的“长度”
      如果滚动方向是垂直方向,则itemExtent代表子组件的高度;
      如果滚动方向为水平方向,则itemExtent就代表子组件的宽度。
      @override
      Widget build(BuildContext context) {
        return Container(
          height: 200,
          child: ListView.builder(
            itemCount: data.length,
            itemBuilder: (context, index) => _buildItem(data[index]),
          ),
        );
      }
    

    3. ListView.separated构建

    构造参数
    在这里插入图片描述

    • separatorBuilder:只多了一个参数,就是为了自定义分割线的
     @override
      Widget build(BuildContext context) {
        return Container(
          height: 200,
          child: ListView.separated(
            separatorBuilder: (context, index) => Divider(
              thickness: 1,
              height: 1,
              color: Colors.orange,
            ),
            itemCount: data.length,
            itemBuilder: (context, index) => _buildItem(data[index]),
          ),
        );
      }
    

    GrideView 差不多

    CustomScrollView 一种高级的listview 配合其他空间可以实现靓的效果

    展开全文
  • Flutter ListView详解

    万次阅读 2018-11-15 22:51:49
    ListView详解ListView常用构造ListViewListView ListTileListView builderListView separatedListView custom ListView常用构造 ListView ListView ListTile ListView builder ListView separated ListView ...

    ListView常用构造

    ListView

    我们可以直接使用ListView 它的实现也是直接返回最简单的列表结构,粗糙没有修饰。

    ListView 默认构建

    效果

    在这里插入图片描述

     ///默认构建
      Widget listViewDefault(List<BaseBean> list) {
        List<Widget> _list = new List();
        for (int i = 0; i < list.length; i++) {
          _list.add(new Center(
            child: new Text(list[i].age.toString()),
          ));
        }
    
    // 添加分割线
        var divideList =
            ListTile.divideTiles(context: context, tiles: _list).toList();
        return new Scrollbar(
          child: new ListView(
            // 添加ListView控件
            children: _list, // 无分割线
    //        children: divideList, // 添加分割线/
          ),
        );
      }
    
    

    ListView ListTile

    ListTileFlutter 给我们准备好的widget 提供非常常见的构造和定义方式,包括文字,icon,点击事件,一般是能够满足基本需求,但是就不能自己定义了

    ListTile 属性

    this.leading,              // item 前置图标
    this.title,                // item 标题
    this.subtitle,             // item 副标题
    this.trailing,             // item 后置图标
    this.isThreeLine = false,  // item 是否三行显示
    this.dense,                // item 直观感受是整体大小
    this.contentPadding,       // item 内容内边距
    this.enabled = true,
    this.onTap,                // item onTap 点击事件
    this.onLongPress,          // item onLongPress 长按事件
    this.selected = false,     // item 是否选中状态
    
    ListTile 使用
    效果

    在这里插入图片描述

      /// ListTile代码
      Widget listViewListTile(List<BaseBean> list) {
        List<Widget> _list = new List();
        for (int i = 0; i < list.length; i++) {
          _list.add(new Center(
            child: ListTile(
              leading: new Icon(Icons.list),
              title: new Text(list[i].name),
              trailing: new Icon(Icons.keyboard_arrow_right),
            ),
          ));
        }
        return new ListView(
          children: _list,
        );
      }
    

    ListView builder

    builder 顾名思义 构造 可以非常方便的构建我们自己定义的child布局,所以在Flutter中非常的常用。

    builder属性详细介绍

       //设置滑动方向 Axis.horizontal 水平  默认 Axis.vertical 垂直
            scrollDirection: Axis.vertical,
            //内间距
            padding: EdgeInsets.all(10.0),
            //是否倒序显示 默认正序 false  倒序true
            reverse: false,
            //false,如果内容不足,则用户无法滚动 而如果[primary]为true,它们总是可以尝试滚动。
            primary: true,
            //确定每一个item的高度 会让item加载更加高效
            itemExtent: 50.0,
            //内容适配
            shrinkWrap: true,
            //item 数量
            itemCount: list.length,
            //滑动类型设置
            physics: new ClampingScrollPhysics(),
             //cacheExtent  设置预加载的区域 
             cacheExtent: 30.0, 
            //滑动监听
    //        controller ,
    

    分析几个比较难理解的属性

    shrinkWrap特别推荐
    child 高度会适配 item填充的内容的高度,我们非常的不希望child的高度固定,因为这样的话,如果里面的内容超出就会造成布局的溢出。
    shrinkWrap多用于嵌套listView中 内容大小不确定 比如 垂直布局中 先后放入文字 listView (需要Expend包裹否则无法显示无穷大高度 但是需要确定listview高度 shrinkWrap使用内容适配不会有这样的影响)

    primary
    If the [primary] argument is true, the [controller] must be null.
    在构造中默认是false 它的意思就是为主的意思,primary为true时,我们的controller 滑动监听就不能使用了

    physics
    这个属性几个滑动的选择
    AlwaysScrollableScrollPhysics() 总是可以滑动
    NeverScrollableScrollPhysics禁止滚动
    BouncingScrollPhysics 内容超过一屏 上拉有回弹效果
    ClampingScrollPhysics 包裹内容 不会有回弹

    cacheExtent
    这个属性的意思就是预加载的区域
    设置预加载的区域 cacheExtent 强制设置为了 0.0,从而关闭了“预加载”

    controller
    滑动监听,我们多用于上拉加载更多,通过监听滑动的距离来执行操作。

    效果

    在这里插入图片描述

     ///listView builder 构建
      Widget listViewLayoutBuilder(List<BaseBean> list) {
        return ListView.builder(
            scrollDirection: Axis.vertical,   
            padding: EdgeInsets.all(10.0),
            reverse: false,
            primary: true,
            itemExtent: 50.0,
            shrinkWrap: true,
            itemCount: list.length,     
            cacheExtent: 30.0, 
            physics: new ClampingScrollPhysics(),
    //        controller ,
            itemBuilder: (context, i) => new Container(
                  child: new Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: <Widget>[
                      new Text(
                        "${list[i].name}",
                        style: new TextStyle(fontSize: 18.0, color: Colors.red),
                      ),
                      new Text(
                        "${list[i].age}",
                        style: new TextStyle(fontSize: 18.0, color: Colors.green),
                      ),
                      new Text(
                        "${list[i].content}",
                        style: new TextStyle(fontSize: 18.0, color: Colors.blue),
                      ),
                    ],
                  ),
                ));
      }
    
    
    builder模式来设置分割线

    我们在正常的需求中大部分是需要item的分割线的,而在builder模式中使用divide 会有种情况(divide放在item的布局中 通过Column),我们会发现divide并没有直接延时到item两端而是会有左右padding
    所以我们可以通过另外一种方式去实现。

    1.扩大list容积 为什么是两倍,因为我们给了divide的index
     Widget listView = new ListView.builder(
                  itemCount: list.length * 2 ,
                  itemBuilder: (context, index) => itemDividerRow(context, index));
    2. 根据下标分配item类型
    itemDividerRow(context, int i) {
    if (i.isOdd) {//是奇数
            return new Divider( //返回分割线
              height: 1.0,
            );
          } else {
            i = i ~/ 2;
            return getRowWidget(context, orderList[i]);  //返回item 布局
          }
         } 
         
    这样我们就可以去实现了,builder模式分割线 
    

    ListView separated

    separated 有分离的意思,其实它就相当于我们Android中的多类型adapter,那么关键就是在我们的这个属性上separatorBuilder

    separatorBuilder

    它和itemBuilder同时进行渲染,在同一个item下标中可以额外的修饰或者区分

      separatorBuilder: (content, index) 
      
      itemBuilder: (content, index) 
    
    separated设置分割线
    separated设置分割线就非常的简单了,我们直接在separatorBuilder进行操作
     separatorBuilder: (content, index) {
       
            return new Divider()
            }
    
    效果

    在这里插入图片描述

    ///  listView separated 构建 用于多类型 分割
    Widget listViewLayoutSeparated(List<BaseBean> list) {
      return ListView.separated(
        itemCount: list.length,
        separatorBuilder: (content, index) {
          //和itemBuilder 同级别的执行
          if (index == 2) {
            return new Container(
              height: 40.0,
              child: new Center(
                child: new Text("类型1"),
              ),
              color: Colors.red,
            );
          } else if (index == 7) {
            return new Container(
              height: 40.0,
              child: new Center(
                child: new Text("类型2"),
              ),
              color: Colors.blue,
            );
          } else if (index == 14) {
            return new Container(
              height: 40.0,
              child: new Center(
                child: new Text("类型3"),
              ),
              color: Colors.yellow,
            );
          } else {
            return new Container();
          }
        },
        itemBuilder: (content, i) {
          return new InkWell(
            child: new Container(
                height: 30.0,
                child: new Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: <Widget>[
                    new Text(
                      "${list[i].name}",
                      style: new TextStyle(fontSize: 18.0, color: Colors.red),
                    ),
                    new Text(
                      "${list[i].age}",
                      style: new TextStyle(fontSize: 18.0, color: Colors.green),
                    ),
                    new Text(
                      "${list[i].content}",
                      style: new TextStyle(fontSize: 18.0, color: Colors.blue),
                    ),
                  ],
                )),
            onTap: () {
              print("1111");
            },
          );
    //      return ;
        },
      );
    }
    

    ListView custom

    大家可能对前两种比较熟悉,分别是传入一个子元素列表或是传入一个根据索引创建子元素的函数。
    其实前两种方式都是第三种方式的“快捷方式”。因为 ListView 内部是靠这个 childrenDelegate 属性动态初始化子元素的。
    我们使用builderseparated比较多,这个custom相对来说就比较少了。但是我们是需要了解的。

      ///listView custom 构建
      Widget listViewLayoutCustom(list) {
    //    return ListView.custom(childrenDelegate: new MyChildrenDelegate());
        return ListView.custom(
          itemExtent: 40.0,
          childrenDelegate: MyChildrenDelegate(
            (BuildContext context, int i) {
              return new Container(
                  child: new Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: <Widget>[
                  new Text(
                    "${list[i].name}",
                    style: new TextStyle(fontSize: 18.0, color: Colors.red),
                  ),
                  new Text(
                    "${list[i].age}",
                    style: new TextStyle(fontSize: 18.0, color: Colors.green),
                  ),
                  new Text(
                    "${list[i].content}",
                    style: new TextStyle(fontSize: 18.0, color: Colors.blue),
                  ),
                ],
              ));
            },
            childCount: list.length,
          ),
          cacheExtent: 0.0,
        );
      }
    }
    
    
    
    childrenDelegate

    自定义childrenDelegate 当然我们可以对ListView中的child进行自己需要的操作。最难定义的也就是这个而已。

    // ignore: slash_for_doc_comments
    /**
     * 继承SliverChildBuilderDelegate  可以对列表的监听
     */
    class MyChildrenDelegate extends SliverChildBuilderDelegate {
      MyChildrenDelegate(
        Widget Function(BuildContext, int) builder, {
        int childCount,
        bool addAutomaticKeepAlive = true,
        bool addRepaintBoundaries = true,
      }) : super(builder,
                childCount: childCount,
                addAutomaticKeepAlives: addAutomaticKeepAlive,
                addRepaintBoundaries: addRepaintBoundaries);
    
      ///监听 在可见的列表中 显示的第一个位置和最后一个位置
      @override
      void didFinishLayout(int firstIndex, int lastIndex) {
        print('firstIndex: $firstIndex, lastIndex: $lastIndex');
      }
    
      ///可不重写 重写不能为null  默认是true  添加进来的实例与之前的实例是否相同 相同返回true 反之false
      ///listView 暂时没有看到应用场景 源码中使用在 SliverFillViewport 中
      @override
      bool shouldRebuild(SliverChildBuilderDelegate oldDelegate) {
        // TODO: implement shouldRebuild
        print("oldDelegate$oldDelegate");
        return super.shouldRebuild(oldDelegate);
      }
    }
    

    文章示例代码

    ListViewDemo

    展开全文
  • 本文来自于我自己学习Flutter时所学习的教程的中文翻译,...在Flutter里创建一个ListView 在这篇文章里,我将展示创建一个能动态插入数据的基本的ListView。让我们开始吧。 1. 一个简单的ListView import 'pack...
  • 理解为ListView 的三种形式吧 ListView 默认构造 但是这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,...
  • Flutter ListView列表布局

    2019-10-05 15:51:42
    ListView 是最常用的滚条列表,它继承至 CustomScrollView,大多 CustomScrollView 的属性都可用。
  • flutter ListView嵌套ListView滚动问题

    千次阅读 2019-08-30 11:32:29
    flutter开发中ListView嵌套ListView时,俩个ListView都会滚动,而不是一个整体,只需要设置子组件不滚动,并设置高度就可以解决这个问题 Widget build(BuildContext context) { return ListView( children: <...
  • Flutter中系统已经为我们提供了google material design的刷新功能 , 样式与原生Android一样. 我们可以使用RefreshIndicator组件来实现Flutter中的下拉刷新,下面们还是先来看下如何使用吧 RefreshIndicator ...
  • 经常遇到滚动需要嵌套滚动的情况,只需要增加两个属性即可: ...return ListView.builder( shrinkWrap: true, //解决无限高度问题 physics: NeverScrollableScrollPhysics(), //禁用滑动事件 ...
  • flutter ListViewListView.build

    千次阅读 2018-11-28 20:27:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • flutter listview 使用

    2019-03-08 16:17:13
    flutterlistview的创建有两种方式 1 直接使用LIstView,这种创建方式需要自己循环建立一个Widget集将Item 布局添加到集中 最后放入listview的children内: ListView( List materialWidgets = []; if ...
  • Flutter Listview异常

    2019-11-06 17:48:08
    ListView出现 ‘package:flutter/src/rendering/box.dart’: Failed assertion: line 1681 pos 12: 'hasSize’. Listview设置为 shrinkWrap: true
  • Flutter ListView列表

    2020-06-03 00:52:44
    ListTitle class HomeContext extends StatelessWidget{ @override Widget build(BuildContext context) { ... return ListView( padding: EdgeInsets.all(10), children: <Widget>[ ListTile( leadin
  • Flutter ListView组件

    2020-09-02 10:14:53
    Flutter ListView组件 列表布局是我们项目开发中最常用的一种布局方式。Flutter中我们可以通过ListView来定义列表项,支持垂直和水平方向展示。通过一个属性就可以控制列表的显示方向。 分类: 1、垂直列表 2、垂直...
  • 刚开始思考着应该和android一样,默认垂直滚动,需要自定义,非常麻烦. ...ListView.builder( scrollDirection: Axis.horizontal, itemBuilder: (context, index) { final Axis slidableDirection = ...
  • flutter ListView 嵌套 CheckBox

    千次阅读 2019-03-15 17:18:35
    解决点击CheckBox选中所有的... import 'package:flutter/material.dart'; import 'package:toast/toast.dart'; import 'package:flutter_refresh/flutter_refresh.dart'; class Person{ String title; Stri...
  • ListView的4种构造方式 默认构造函数(传入 List children) ListView( children: <Widget>[ ListTile(title: Text("普通ListView")), ListTile( title: Text("ListView.buil...
  • Flutter ListView无法置顶

    2019-03-04 14:05:30
    今天写了个listView例子,我没有加AppBar,在ios手机上跑起来的时候发现沉浸栏(也有人叫它安全区域)那一块空白,看着很丑,想着如何能让listView置顶,后来查看了一下源码,将ListView的padding属性,设置为:...
  • Flutter ListView注意问题

    2020-06-27 22:04:09
    1. 嵌套ListView 子级ListWiew需要如下设置,比秒出现问题 ListView( children: <Widget>[ ListView( shrinkWrap: true, //为true可以解决子控件必须设置高度的问题 physics:NeverScrollableScrollPhysics...
  • 不得不说,Flutter 绘制 UI 的速度和原生根本不是一个量级的,Flutter 要快的多了,比如常用的 ListView 控件,原生写的话,比如 Android,如果不封装的话,需要一个 Adapter、ViewHolder,再加个 xml 布局文件,而 ...
  • Flutter ListView UI异常

    2019-09-27 11:12:32
    一个是正常的ListView,另外一个是带分割线的listview 为什么正常的listview,body99那里没有展示完整??? 代码如下 @override Widget build(BuildContext context) { // This method is rerun every ...

空空如也

1 2 3 4 5 ... 20
收藏数 1,163
精华内容 465
关键字:

flutter listview