Flutter:StatelessWidget 和 StatefulWidget区别
简介Flutter给我们提供了StatelessWidget 和 StatefulWidget这两个类,用于自定义控件。StatelessWidget 是一种无状态的控件,StatefulWidget是一种有状态个控件,程序运行过程中可对其内部的数据就行修改的控件。
在Flutter中自定义组件其实就是一个类,这个类需要继承StatelessWidget/StatefulWidget:
- StatelessWidget:是无状态组件,状态不可变的widget,例如:Icon、IconButton、Text等等
- StatefulWidget:是有状态组件,持有的状态可能在widget生命周期改变,例如:Checkbox, Radio, Slider, InkWell, Form, and TextField 都是 stateful widgets, 它们都是 StatefulWidget的子类。
通俗的讲我们要改变组件页面上面的数据的话就继承StatefulWidget,如果页面上面的数据是永远不变的话就继承StatelessWidget。
下面我就举例说明:
1、StatelessWidget
如果我们编写一个简单的Hello,就可以继承StatelessWidget类,代码如下:
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Welcome to Flutter',
home: new Scaffold(
appBar: new AppBar(
title: new Text('Welcome to Flutter'),
),
body: new Center(
child: new Text('Hello World'),
),
),
);
}
}
2、StatefulWidget
StatefulWidget 是可变状态的widget。 使用setState方法管理StatefulWidget的状态的改变。调用setState告诉Flutter框架,某个状态发生了变化,Flutter会重新运行build方法,以便应用程序可以应用最新状态。
创建项目后默认的计数器就是使用的StatefulWidget类,代码如下:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '应用',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter第一个应用'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'点击次数:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: '新增',
child: Icon(Icons.add),
),
);
}
}
在编写以一个自定义的组件的时候就需要考虑好需要选择怎么样的继承类,如果内部需要更新一些值就需要选择有状态的StatefulWidget、如果只是一些展示的内容就选择无状态的StatelessWidget类继承。
分割线是也是比较常用的组件,本文主要介绍下Divider和VerticalDiVider的使用方法。
速查表是自己整理了一份在工作中常用的一些资料,包含了自己在日常开发中需要常常用到的相关技术。可以给读者进行参考。
平时在使用终端的时候总是感觉样式不太美观,智能提示不太友好。恰巧今天在无意间看到了oh my zsh这个框架,让你瞬间觉得终端还可以这样玩。本文主要介绍安装方式,留着以后使用。
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用了分治思想的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列间有序。如果将两个有序表合并成一个有序表,称为二路归并。
SkyWalking是一个开源的观测平台,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据。SkyWalking 提供了一种简便的方式来清晰地观测分布式系统,甚至可以观测横跨不同云的系统。SkyWalking 更像是一种现代的应用程序性能监控(Application Performance Monitoring,即APM)工具,专为云原生,基于容器以及分布式系统而设计。
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题