8.flutter之GridView和自定义控件,以及Row,Expanded
GridView其实这个跟安卓原生里的listView的进阶版RecyclerView很像,什么瀑布流,网格流都基本靠这个来实现的GridView的写法和listView的写法大同小异这边先初始化20条item看看效果import 'package:flutter/material.dart';import 'package:flutter_app/ClipOval.dart';void main
GridView
其实这个跟安卓原生里的listView的进阶版RecyclerView很像,什么瀑布流,网格流都基本靠这个来实现的
GridView的写法和listView的写法大同小异
这边先初始化20条item看看效果
import 'package:flutter/material.dart';
import 'package:flutter_app/ClipOval.dart';
void main()=>runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("FlutterDemo")),
body: Layout(),
),
);
}
}
class Layout extends StatelessWidget{
List<Widget> _getData(){
List<Widget>list=new List();
for(var i=0;i<20;i++){
list.add(Container(
alignment: Alignment.center,
child: Text(
"这是第$i条数据",
style: TextStyle(color: Colors.white,fontSize: 20),
),
color: Colors.blue,
));
}
return list;
}
@override
Widget build(BuildContext context) {
return GridView.count(//创建的方法,根据数量来创建
crossAxisSpacing: 20.0,//水平元素的距离
mainAxisSpacing: 20.0,//垂直元素的距离
childAspectRatio: 0.6,//宽度和高度的比例
padding: EdgeInsets.all(10),
crossAxisCount: 2,
children: this._getData(),
);
}
}
可以看到这个效果就跟网格流布局一样,
然后就是导入那个res里面的资源
import 'res/listDataAuto.dart';
import 'package:flutter/material.dart';
import 'res/listDataAuto.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("FlutterDemo")),
body: Layout(),
),
);
}
}
class Layout extends StatelessWidget {
List<Widget> _getListData() {
var templist = list.map((value) {
return Container(
child: Column(
children: <Widget>[
Image.network(value['imageUrl']),
SizedBox(height: 10,),
Text(
value['title'],
textAlign: TextAlign.center,
),
],
),
decoration: BoxDecoration(
border: Border.all(
color: Color.fromRGBO(222, 222, 222, 0.9), width: 1)),
);
});
return templist.toList();
}
@override
Widget build(BuildContext context) {
return GridView.count(
crossAxisSpacing: 20.0,
//水平元素的距离
mainAxisSpacing: 20.0,
//垂直元素的距离
childAspectRatio: 0.7,
//宽度和高度的比例
padding: EdgeInsets.all(10),
crossAxisCount: 2,
children: this._getListData(),
);
}
}
这就可以实现,因为当时我的图片都手机壁纸那种尺寸,所以当时一直警告,我调节的时候就重新换了下图片
padding
接入一个Padding的实例,让GridView的控件实现所有边距相等
这边调用的图片资源是我自己代码里的images的图片
class Layout extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
child: GridView.count(
crossAxisCount: 2,
children: <Widget>[
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img1.jpg",
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img2哈哈.jpg",
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img3.jpg",
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img4.jpg",
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img5.jpg",
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img6.jpg",
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img7.jpg",
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
"images/img8.jpg",
fit: BoxFit.cover,
),
),
],
),
);
}
}
这样看着应该还算舒服吧。
自定义控件
定义一个传入图标,颜色数据,得到如下效果
然后就可以自定义出自己图片,自己尺寸,自己背景颜色的图标按钮了
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'res/listDataAuto.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("FlutterDemo")),
body: Layout(),
),
);
}
}
class Layout extends StatelessWidget {
@override
Widget build(BuildContext context) {
return IconContainer(Icons.add,size:40.0);
}
}
class IconContainer extends StatelessWidget {
double size=32;
Color color=Colors.blue;
IconData icon;
IconContainer(this.icon, {this.size, this.color}) {}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Container(
height: 100,
width: 100,
color: this.color,
child: Icon(
this.icon,
size: this.size,
color:Colors.white,
),
);
}
}
调用的方式其实就是先导入包,然后就直接使用这个类的方法就好了
Row、Column
紧接着的是Row组件,这就跟原生的LinearLayout一样,这个是水平的,但是没有线性布局里的权重,权重独立出来了,Expanded这个就是原生里面的权重
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app/DIYIcon.dart';
import 'res/listDataAuto.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("FlutterDemo")),
body: Layout(),
),
);
}
}
class Layout extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: 800.0,
color: Colors.deepOrangeAccent,
child: Row(
//所有距离均匀分配,主轴的,这里是横向的
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
//用的比较少,这是次轴纵向的
crossAxisAlignment: CrossAxisAlignment.start,
children: [
IconContainer(Icons.add,color: Colors.redAccent,size: 40.0,),
IconContainer(Icons.hail,color: Colors.blue,size: 40.0,),
IconContainer(Icons.search_off_sharp,color: Colors.deepPurple,size: 40.0,),
],
),
);
}
//column用法一样
}
直接省略column的写法了,毕竟和row的都一样。
Expanded
直接学习Expanded这个权重了
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app/DIYIcon.dart';
import 'res/listDataAuto.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("FlutterDemo")),
body: Layout(),
),
);
}
}
class Layout extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Row(
children: [
//权重。原生的weight
Expanded(
flex: 1,
child: IconContainer(
Icons.add,
color: Colors.redAccent,
size: 40.0,
)),
Expanded(
flex: 2,
child: IconContainer(
Icons.hail,
color: Colors.blue,
size: 40.0,
)),
IconContainer(
Icons.image_aspect_ratio_outlined,
color: Colors.lightBlueAccent,
size: 40.0,
),
],
),
);
}
//这就能使用了,
}
可以看到我们就实现了权重的效果了
nContainer(
Icons.hail,
color: Colors.blue,
size: 40.0,
)),
IconContainer(
Icons.image_aspect_ratio_outlined,
color: Colors.lightBlueAccent,
size: 40.0,
),
],
),
);
}
//这就能使用了,
}
[外链图片转存中...(img-5H79ShQb-1617875909841)]
**可以看到我们就实现了权重的效果了**
更多推荐
所有评论(0)