34

Flutter 第四讲:初探 ListView

 4 years ago
source link: https://mp.weixin.qq.com/s/SoEGDDkKI3tVTpw8AbFDKA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今天我们来看看 FlutterListView ,我们会展示一个简单的汽车的列表,那么我们首先新建一个 car.dart ,两个属性一个构造方法,还有一个模仿网络返回的本地数组,因为太占地方,我就只写前几个了

class Car {
  const Car({
    this.name,
    this.imageUrl
});

  final String name;
  final String imageUrl;

}

final List<Car> datas = [
  Car(
    name: '保时捷918 Spyder',
    imageUrl:
    'https://upload-images.jianshu.io/upload_images/2990730-7d8be6ebc4c7c95b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
  ),
  Car(
    name: '兰博基尼Aventador',
    imageUrl:
    'https://upload-images.jianshu.io/upload_images/2990730-e3bfd824f30afaac?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
  ),
  Car(
    name: '法拉利Enzo',
    imageUrl:
    'https://upload-images.jianshu.io/upload_images/2990730-a1d64cf5da2d9d99?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
  )
  ......
];

为了便于讲解,我们把 MaterialApp 里的 home ,抽出来新建一个 Home

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('FlutterDemo')),
      body: ListView.builder(itemCount: datas.length,
      itemBuilder: _cellForRow,),
    );
  }
}

这次我们把 body 换成, ListView.builder() ,它有一个 itemCount ,大家都猜出来是什么了,列表的行数,还有一个 itemBuilder 是一个回调函数,我们写一个 _cellForRow 的方法,我们先简单的返回一个 Text Widget

Widget _cellForRow(BuildContext context, int index) {
  return Text('123');
}

我们保存下看看效果

aMfeAzF.jpg!web

是不是跟iOS的TableView也很像,这个更简单不用去遵循 DelegateDataSource 了,还有同学可能会问 section 怎么办?很遗憾 Flutter 并没有给我们封装好 section ,只能我们自己来实现,后面我们也会说这个怎么实现,接下来我们来用上我们的datas里面的数据,在这之前我们还是再来介绍一个新的WIdget-- Container ,这个我们会经常用到,你可以把它想象成空 Div 或者纯净的 UIView ,可以添加子Widget的,我们改下我们上面的代码,我们先只显示图片看下,Image有个network方法可以直接传入url来显示

Widget _cellForRow(BuildContext context, int index) {
  return Container(
    child: Image.network(datas[index].imageUrl),
  );
}

再来看下,图片是不是出来了

VBjmUby.jpg!web

我们的文字改怎么显示呢,接下来我们再来介绍一个 Column 布局,它有个 children 属性可以传入多个 Widget , 我们添加个 margin 让显示更好看一点,同时我们的image和text之间如果嫌太近我们可以加一个 SizedBox 来分割下

Widget _cellForRow(BuildContext context, int index) {
  return Container(
    color: Colors.white,
    margin: EdgeInsets.all(10),
    child: Column(
      children: <Widget>[
        Image.network(datas[index].imageUrl),
        SizedBox(
          height: 10,
        ),
        Text(datas[index].name),
      ],
    ),
  );
}

这下我们来看下最终的效果

RrqumqY.jpg!web

这里我们扩展下,有Column,是不是会有相对的Row呢,答案是肯定的,其实还有一个Stack,我就不贴图了,大家可以自己试下看看效果,一般我们开发用这三种布局就差不多够用了

今天我们就先简单的介绍下ListView使用,废话不多说,明天我们就直接进入我们的项目实战

One More Thing (福利来了)

VNNnqeJ.png!web

长按二维码查看 2020—课程列表 全网IT各种资源有需求的可以微我,或者你喜欢的课程都可以给我发链接剩下的我来搞定

AFNRfy6.png!web

喜欢的朋友可以扫描关注我的公众号(多多点赞,多多打赏,您的支持是我写作的最大动力) 关注有福利可以使用免费梯子自由上网

zi2yYj2.jpg!web

iOS_DevTips


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK