-
main.dart
import 'package:flutter/material.dart';
runApp()
MaterialApp(
home:Scaffold(
appBar:AppBar(),
body: Center(
child:Text("文本信息"),
textDirection:TextDirection.ltr
)
)
)
-
自定义组件Container()
StatelessWidget 无状态组件
alignment: Alignment.bottomLeft
border: Border.all
borderRadius: BorderRadius.circular(100),
boxShadow: const [
BoxShadow(color: Colors.black, blurRadius: 10.0)
])
gradient:
const LinearGradient(colors: [Colors.red, Colors.yellow]),
transform: Matrix4.rotationZ(0.2),
transform: Matrix4.skewY(0.45),
transform: Matrix4.translationValues(40, 10, 10),
margin: const EdgeInsets.fromLTRB(0, 20, 0, 0),
padding:const EdgeInsets.all(4),
child: Image.network("https://www.itying.com/themes/itying/images/ionic4.png",
scale: 2,
fit: BoxFit.fitWidth,
repeat: ImageRepeat.repeatX,
class MyBody extends StatelessWidget {
const MyBody({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Container(
alignment: Alignment.topLeft,
width: screenWidth * 0.9,
height: screenHeight * 0.5,
decoration: BoxDecoration(
color: Colors.yellow,
border: Border.all(
color: Colors.red,
),
),
child: Text(
"哈哈哈AF 哈",
style: TextStyle(color: Colors.white, fontSize: 30.0),
),
),
);
}
---圆形背景图
width: 150,
height: 150,
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(75),
image: const DecorationImage(
image: NetworkImage(
"https://www.itying.com/themes/itying/images/ionic4.png",
),
fit: BoxFit.cover)),
----圆形图片 2
ClipOval(
child: Image.network(
"https://www.itying.com/themes/itying/images/ionic4.png",
width: 150,
height: 150,
fit: BoxFit.cover,
),
);
本地图片
配置
assets:
- images/dw.jpg
- images/hg.png
使用
SizedBox(
height: 150,
width: 150,
child: Image.asset(
"images/hg.png",
),
);
图标,自带图标,自定义图标
自带图标
Icon(Icons.category),
自定义图标
配置
fonts:
- family: myIcon
fonts:
- asset: fonts/iconfont.ttf
自定义类
static const IconData book =
IconData(0X3447, fontFamily: "myIcon", matchTextDirection: true);
使用
Icon(
ItYing.weixin,
size: 40,
color: Colors.green,
)
StatefulWidget 有状态组件
-
列表组件
ListView
scrollDirection: Axis.horizontal, 列表方向
listView高度一般是自适应,需要在嵌套一个盒子
ListView(
children: const <Widget>[
ListTile(
leading: Icon(
Icons.home,
),
title: Text("首页"),
),
ListView.builder
ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text("${list[index]}"),
);
},
);
-
ListView.builder//循环
import 'package:flutter/material.dart';
import './ListData.dart';
listView直接嵌套listView,会导致里面不能滑动
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.cyan,
),
home: Scaffold(
appBar: AppBar(
title: Text("首页"),
),
body:const MyHomePage(),
),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: ListData.length,
itemBuilder: (context,index){
return ListTile(leading: Image.network(ListData[index]["imageUrl"]),
title: Text(ListData[index]["title"]),
subtitle: Text(ListData[index]["author"]),);
},
);
}
}
GridView.count(
crossAxisCount:5,
padding: const EdgeInsets.all(10),
crossAxisCount: 3,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1.0,
GridView.extent(
maxCrossAxisExtent:200,
GridView.builder
@override
Widget build(BuildContext context) {
return GridView.builder(
padding: const EdgeInsets.all(10),
itemCount: ListData.length,
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 220,
childAspectRatio: 1,
crossAxisSpacing: 10,
mainAxisSpacing: 10),
itemBuilder: _init,
);
}
Padding 组件
Padding(
padding: EdgeInsets.all(10)
)
Row 组件
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
IconContainer(
Icons.home,
color: Colors.blue,
),
IconContainer(
Icons.search,
),
IconContainer(
Icons.safety_check,
color: Colors.blue,
),
],
);
width: double.infinity,
height: double.infinity,
FLex组件
Flex(
direction: Axis.horizontal,
children: [
Expanded(
flex: 1,
child: IconContainer(
Icons.home,
color: Colors.blue,
),
),
Expanded(
flex: 2,
child: IconContainer(
Icons.search,
),
)
],
);
import 'package:flutter/material.dart';
import './ListData.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.cyan,
),
home: Scaffold(
appBar: AppBar(
title: Text("首页"),
),
body: const HomePage(),
),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: [
Container(
width: double.infinity,
height: 200,
color: Colors.black,
),
Row(
children: [
Expanded(
flex: 2,
child: SizedBox(
height: 180,
child: Image.network(
"https://www.itying.com/images/flutter/1.png",
fit: BoxFit.cover,
),
)),
Expanded(
flex: 1,
child: SizedBox(
height: 180,
child: Column(
children: [
Expanded(
flex: 1,
child: SizedBox(
width: double.infinity,
child: Image.network(
"https://www.itying.com/images/flutter/2.png",
fit: BoxFit.cover,
),
)),
const SizedBox(
height: 5,
),
Expanded(
flex: 2,
child: Image.network(
"https://www.itying.com/images/flutter/3.png",
fit: BoxFit.cover,
),
),
],
)),
)
],
)
],
);
}
}
Stack和Positioned组件
Stack(
children: [
ListView(
children: const [
ListTile(
title: Text("我是列表1"),
),
Divider(),
Positioned(
left: 0,
top: 0,
width: size.width,
height: 44,
child: Row(
children: [
Expanded(
flex: 1,
child: Container(
alignment: Alignment.center,
height: 44,
color: Colors.red,
child: const Text(
"二级导航",
style: TextStyle(color: Colors.white),
),
))
],
))
Align()组件
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
return Column(children: [
SizedBox(
height: 40,
width: double.infinity,
child: Stack(
children: const [
Align(
alignment: Alignment.topLeft,
child: Text("次"),
),
Align(
alignment: Alignment.topRight,
child: Text("多次"),
)
],
))
]);
}
}
获取设备得宽度
final size = MediaQuery.of(context).size;
Card()组件
Card(
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
elevation: 10,
child: Column(children: const [
ListTile(
title: Text(
"张三",
style: TextStyle(fontSize: 28),
),
subtitle: Text("高级软件工程师"),
),
Divider(),
ListTile(
title: Text("18782074553"),
),
ListTile(
title: Text("地址:啊手动阀静安四季的风哈时间"),
),
]),
),