Flutter有无状态类与State及生命周期详细介绍

下面是关于Flutter的无状态类与有状态类及其生命周期方法的详细介绍及示例:

Flutter有状态类和无状态类

Flutter中的类可以分为有状态和无状态两种。有状态的类可以通过修改自身的状态来动态改变其外观和行为,而无状态类则不具有这种能力。通常情况下,我们会在页面中使用有状态的类,而在内容单一或无需动态变化的组件中使用无状态的类。

无状态类

无状态类是指不需要维护状态的组件,它们通常是不可变的。无状态类中所有的属性都是final类型,一旦初始化后就无法更改。由于无状态类不需要维护状态,它的布局和渲染可以在每一次重绘时都完全重新执行,因此在性能上有一定的优势。

下面是一个简单的无状态组件示例,其中展示了一个文本和一张图片:

class StatelessPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("无状态组件示例"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "这是一个无状态组件",
              style: TextStyle(fontSize: 18),
            ),
            Image.network(
              "https://picsum.photos/250?image=9",
              width: 250,
            ),
          ],
        ),
      ),
    );
  }
}

有状态类

有状态类是指可以改变自身状态的组件,可以在运行时根据需要改变其外观或行为。在Flutter中,使用StatefulWidgetState类来创建有状态组件。StatefulWidget是一个可变的组件,而State则是一个不可变的对象,它持有可改变的部分。

对于一个有状态组件,其状态可以通过引用State对象来修改,在状态发生改变时,Flutter会自动调用build方法来重新渲染组件。这样可以保持UI与状态的同步,同时也可能导致重复渲染和性能问题。

下面是一个简单的有状态组件示例,其中展示了一个带计数器的按钮:

class StatefulPage extends StatefulWidget {
  @override
  _StatefulPageState createState() => _StatefulPageState();
}

class _StatefulPageState extends State<StatefulPage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("有状态组件示例"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "按钮被点击了 $_counter 次",
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _incrementCounter,
              child: Text("点击我"),
            ),
          ],
        ),
      ),
    );
  }
}

生命周期

在Flutter中,我们可以通过钩子(hook)函数来控制组件的生命周期,这些钩子函数包括:

  • initState:在创建组件时调用,可以用来做一些初始化操作。
  • build:每次状态发生变化时都会调用,用来构建组件的UI。
  • didChangeDependencies:在build方法前调用,用来在依赖更改时更新状态,例如父级组件的数据变化可能会导致子组件的状态变化。
  • setState:用来改变组件的状态,并触发UI重构。
  • deactiving:在组件从树上移除时调用,通常可以用来取消定时器或停止动画等操作。
  • dispose:在组件永久从内存中删除时调用,通常可以用来释放资源或取消与其它对象的连接。

下面是一个带有生命周期的有状态组件示例,其中我们在组件创建时注册了定时器,在组件销毁时取消了定时器:

class LifecyclePage extends StatefulWidget {
  @override
  _LifecyclePageState createState() => _LifecyclePageState();
}

class _LifecyclePageState extends State<LifecyclePage> {
  Timer _timer;

  @override
  void initState() {
    super.initState();
    print("initState");
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      print("Timer tick");
    });
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print("didChangeDependencies");
  }

  @override
  Widget build(BuildContext context) {
    print("build");
    return Scaffold(
      appBar: AppBar(
        title: Text("生命周期示例"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "生命周期示例",
              style: TextStyle(fontSize: 18),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void deactivate() {
    print("deactivate");
    super.deactivate();
  }

  @override
  void dispose() {
    print("dispose");
    _timer.cancel();
    super.dispose();
  }
}

以上就是关于Flutter的无状态类与有状态类及其生命周期的详细介绍和示例说明。希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flutter有无状态类与State及生命周期详细介绍 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 用类的继承关系(重写父类的方法)实现简易后台代码模板

    使用类的继承关系,可以很方便地实现后台代码模板的重用,而重写父类的方法则可以灵活地适应各种不同的需求。 以下是使用类的继承关系实现简易后台代码模板的详细攻略: 定义一个基础的后台代码模板类 BaseTemplate,其中包含了一些公共的方法和属性。 class BaseTemplate: """后台代码模板基类"&qu…

    other 2023年6月26日
    00
  • [Micropython]TPYBoard v10x拼插编程实验 点亮心形点阵

    Micropython TPYBoard v10x拼插编程实验 点亮心形点阵的完整攻略 本文将详细讲解如何使用Micropython和TPYBoard v10x拼插板点亮心形点阵。本文将包括以下内容: 心形点阵的介绍 TPYBoard v10x拼插板的介绍 Micropython的介绍 点亮心形点阵的实现 示例说明 心形点阵的介绍 心形点阵是一种常见的LED…

    other 2023年5月5日
    00
  • rabbitmq简单的消息发送与接收

    RabbitMQ简单的消息发送与接收攻略 RabbitMQ是一种流行的消息队列系统,它可以用于分布式系统中的消息传递和异步任务处理。本文将提供一个完整攻略,介绍RabbitMQ的简单消息发送与接收,并提供两个示例说明。 RabbitMQ的安装配置 在使用RabbitMQ之前,需要先安装和配置RabbitMQ。具体步骤如下: 步骤1:安装RabbitMQ 在官…

    other 2023年5月8日
    00
  • 深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题

    深入学习Spring Boot排查 @Transactional 引起的 NullPointerException 问题 问题描述 在使用 Spring Boot 进行开发时,经常会用到 @Transactional 注解来管理事务。然而,有时候在使用 @Transactional 注解的过程中,可能会遇到 NullPointerException(空指针异…

    other 2023年6月28日
    00
  • 魔兽世界8.0冰法堆什么属性好 8.0冰法属性选择优先级及收益一览

    魔兽世界8.0冰法堆什么属性好 冰法在8.0版本后,属性选择和收益都有所不同。大部分属性选择至多两种,需要权衡利弊。以下是属性选择及其权重的顺序,以及每个属性的收益。 优先级和收益一览 智力:智力是冰法最重要的属性。提高智力可提高法术强度,增加法术暴击和精通。每提高1点智力,可以提升1点法术强度。智力的每1%会提高0.8%的法术暴击和精通。 急速:急速可以提…

    other 2023年6月27日
    00
  • Git的基础文件操作初始化查看添加提交示例教程

    好的。首先,我们需要了解Git是什么,它的基本概念以及工作原理,然后再来学习如何进行基础文件操作。 Git的基本概念和工作原理 Git是一种分布式版本控制系统,可以帮助我们跟踪代码的变化,管理代码的版本,协同开发等。Git有三个基本区域:工作区、暂存区和本地仓库。其中,工作区是我们平常编写代码的地方,暂存区用于暂存我们需要提交的文件,本地仓库是存储我们提交的…

    other 2023年6月20日
    00
  • 如何使用pyinstaller打包32位的exe程序

    如何使用PyInstaller打包32位的exe程序 PyInstaller是一个用于将Python程序打包成独立可执行文件(exe)的工具。默认情况下,PyInstaller会根据操作系统的位数(32位或64位)生成相应的可执行文件。如果你需要生成32位的exe程序,可以按照以下步骤进行操作: 步骤1:安装PyInstaller 首先,确保你已经安装了Py…

    other 2023年7月28日
    00
  • Vuejs 单文件组件实例详解

    Vue.js 单文件组件实例详解攻略 什么是 Vue.js 单文件组件? Vue.js 单文件组件是一种将 HTML 模板、JavaScript 代码和 CSS 样式封装在一个文件中的组件化开发方式。它能够提高代码的可维护性和复用性,使得开发者能够更加高效地构建复杂的用户界面。 单文件组件的结构 一个典型的 Vue.js 单文件组件由三个部分组成:模板(te…

    other 2023年8月21日
    00
合作推广
合作推广
分享本页
返回顶部