StatelessWidget(商品列表)
import 'package:flutter/material.dart';
main()=>runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HYHomePage(),
);
}
}
class HYHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('商品列表'),
),
body: HYHomeContent(),
);
}
}
class HYHomeContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(
children: <Widget>[
HYHomeContentItem('dsf','aaa',
'https:
SizedBox(height: 10),
HYHomeContentItem('aaa','ccc',
'https:
SizedBox(height: 10),
HYHomeContentItem('ddd','xxx',
'https:
],
);
}
}
class HYHomeContentItem extends StatelessWidget {
final String title;
final String desc;
final String imgUrl;
HYHomeContentItem(this.title,this.desc,this.imgUrl);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(12),
decoration: BoxDecoration(
border: Border.all(color: Colors.pink,width: 5)
),
child: Column(
children: <Widget>[
Text(title,style: TextStyle(fontSize: 20)),
SizedBox(height: 5),
Text(desc,style: TextStyle(fontSize: 16)),
SizedBox(height: 5),
Image.network(imgUrl)
],
),
);
}
}
StatefulWidget(简易计数器)
- 为什么flutter设计StatefulWidget的build方法不在Widget里面,而是在State里面?
1.build出来的Widget是需要依赖State中的变量(状态/数据);
2.在flutter的运行过程中,Widget是不断销毁和创建的;当我们自己的状态发生改变时,并不希望重新状态一个新的State。
- 综合案例
import 'package:flutter/material.dart';
main()=>runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HYHomePage(),
);
}
}
class HYHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('flutter')),
body: HYHomeContent('你好啊,aaa'),
);
}
}
class HYHomeContent extends StatefulWidget {
final String mes;
HYHomeContent(this.mes);
@override
State<StatefulWidget> createState() {
return _HYContentBodyState();
}
}
class _HYContentBodyState extends State<HYHomeContent>{
int _count=0;
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
color: Colors.red,
child: Text('+',style: TextStyle(fontSize: 20,color: Colors.white)),
onPressed: (){
setState(() {
_count++;
});
},
),
RaisedButton(
color: Colors.pink,
child: Text('-',style: TextStyle(fontSize: 30,color: Colors.white)),
onPressed: (){
setState(() {
_count--;
});
},
)
],
),
Text('当前计数: $_count',style: TextStyle(fontSize: 20)),
Text('传递过来的信息:${widget.mes}')
],
),
);
}
}
1.StatelessWidget从父类传值直接传就可以;StatefulWidget从父类传值可以一个参数一个参数传递,也可以在State中通过widget.参数获取(State类里面有一个widget属性,可直接通过该属性获取参数);
2.StatefulWidget必须实现createState方法,在State中通过setState改变数据状态。
生命周期
flutter的编程范式
声明式编程(依靠自己自动进行状态管理,而不是手动更新)