StatefulComponent使用方法入门

在上一篇Flutter入门之无状态组件中我们讲到了无状态组件,所谓的无状态组件指的就是其内部的状态是来自其父组件并使用final类型的变量来存储,当组件被build的时候它们就使用这些不可变的数据来构建自己的UI。

为了构建更加复杂且可和用户产生交互的组件,在flutter中提供了StatefulComponents来实现这种需求。

下面来看一个简单的例子‘点击按钮,并在按钮文字上不断更新点击的次数’。

import 'package:flutter/material.dart';
import 'flat_color_button.dart'; class Counter extends StatefulComponent { //(1)
_CounterState createState() => new _CounterState(); //(2)
} class _CounterState extends State<Counter> { //(3)
int _count = 0; //(3) void _increment() {
setState(() { //(4)
++_count;
});
} Widget build(BuildContext context) {
return new Container(
decoration: new BoxDecoration(backgroundColor: Colors.grey[100]),
child: new Center(
child: new RaisedButton(
onPressed: _increment,
child: new Text('click count : ${_count}'))));
}
} main() {
runApp(new MaterialApp(
title: 'counter', routes: {'/': (RouteArguments args) => new Counter()}));
}

运行结果如下:

代码解释如下:

  • (1)你可能觉得有些奇怪,为什么StatefulComponentState要分开使用而不是集成在StatefulComponent内部,这是因为它们两个在程序的运行过程中有各自的生命周期,StatefulComponent仅用来表示控件的表现形式随时可能发生改变,而State的生命周期存在与两次build方法之间。
  • (2)当框架得知组件是StatefulComponent的时候回去调用createState()来获得其组件内容。
  • (3)State内部存储可变状态值,并通过实现build来构建组件。
  • (4)这里非常重要,当在State内部改变任何子控件需要的变量时,都需要使用setState,当调用了setState后,底层框架会把当前控件标记为一个‘脏’组件,接着会在必要的时刻重新调用组件的build方法来刷新其子控件,由此起到刷新的作用

StatefulComponent的基本用法就是这样,再复杂的控件设计,只要遵循以上的规范,就能有良好的用户体验。

Flutter入门之有状态组件的更多相关文章

  1. Flutter入门之无状态组件

    Flutter核心理念 flutter组件采用函数式响应框架构建,它的灵感来自于React.它设计的核心思想是组件外构建UI,简单解释一下就是组件鉴于它当前的配置和状态来描述它的视图应该是怎样的,当组 ...

  2. StatelessWidget 无状态组件 StatefulWidget 有状态组件 页面上绑定数据、改变页面数据

    一.Flutter 中自定义有状态组件 在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget. StatelessWidget ...

  3. Flutter StatefulWidget 有状态组件、页面上绑定数据、改变页面数据

    在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget. StatelessWidget 是无状态组件,状态不可变的 widget ...

  4. Flutter入门教程(四)第一个flutter项目解析

    一.创建一个Flutter工程 1.1 命令行创建 首先我们找一个空目录用来专门存放flutter项目,然后在路径中直接输入cmd: 使用 flutter create <projectname ...

  5. Bootstrap入门(十七)组件11:分页与标签

    Bootstrap入门(十七)组件11:分页与标签   1.默认样式的分页 2.分页的大小 3.禁用的分页 4.翻页的效果 5.两端对齐的分页 6. 标签的不同样式 7. 标签的大小   先引入本地的 ...

  6. 14Flutter StatefulWidget有状态组件、页面上绑定数据、改变页面数据、实现计数器功能、动态列表

    /** * Flutter StatefulWidget有状态组件.页面上绑定数据.改变页面数据 * 在Flutter中自定义组件其实就是一个类,这个类需要继承StatelessWidget/Stat ...

  7. Flutter入门(三)-底部导航+路由

    * StatefulWidget 如果想改变页面中的数据就要用到StatefulWidget,之前自定义组件继承的StatelessWidget是不能动态修改页面数据的 //自定义有状态组件 clas ...

  8. StatefulWidget 有状态组件

    在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget: StatelessWidget 是无状态组件,状态不可变的 widget ...

  9. flutter 入门(Mac)

    背景 近一年时间都在用 React Native 开发公司的 APP,水平基本上可以说是登堂入室了.前一段时间兴起一阵 Flutter 热,后端的同事都有推荐,今年 Google 大会又推出 flut ...

随机推荐

  1. css3 使用animation实现动画效果

    .rotation { -webkit-animation-name: rotation; -webkit-animation-duration: 30s; -moz-animation-name: ...

  2. 解决gremlin-dirver访问tinkerpop服务器提示序列化错误

    解决gremlin-dirver访问tinkerpop服务器提示序列化错误 问题描述 程序集成了gremlin-driver,访问远程tinkerpop服务器,在执行创建节点操作时,返回如下错误栈: ...

  3. II7.5配置IIS支持2G文件下载

    IIS默认支持下载在20M让IIS7.5支持大文件下载,有两个地方 1.打IIS管理器->asp->点限制属性+->设置最大请求实体主体限制为2147483648 2.打开路径C:\ ...

  4. IIS6.0应用程序池回收(转载)

    这段时间公司的程序经常出现问题,然后整个应用程序就不能访问了,我们的服务器版本:window 2003 SP1,IIS6.0,没有安装Microsoft Visual Studio .NET . 问题 ...

  5. c#, extract number from string

    using System.Text.RegularExpressions; string numberStr = Regex.Match (str, "[0-9]").Value; ...

  6. PHP REST架构简单设计

    REST是什么? REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性. REST的特点 ...

  7. BZOJ 3000(Big Number-Stirling公式求n!近似值)

    3000: Big Number Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 220  Solved: 62 [Submit][Status] De ...

  8. lua 打印 table 拷贝table

    -- 打印table function print_lua_table (lua_table, indent) if lua_table == nil or type(lua_table) ~= &q ...

  9. 解决/usr/bin/ld: cannot find -lssl

    一般情况下,-lssl表示要寻找库 libssl.so, 而上面的错误表示ld找不到这个库,一般情况下,原因是系统中没有安装这个库,只要安装就好了. 可以先使用sudo apt-cache searc ...

  10. windows包管理

    # windows包管理 ### 前言-----------------------------windows下好用的包管理程序类似于npm,安装curl程序方便.yum 的感觉 ### 包管理--- ...