【Flutter 面试题】什么是Widget,Stateful Widget和Stateless Widget之间的区别?

news/2024/7/20 22:46:48 标签: flutter, 开发语言, android, ios, 前端

【Flutter 面试题】什么是Widget,Stateful Widget和Stateless Widget之间的区别?

文章目录

    • 写在前面
    • 解答
    • 补充说明
      • StatelessWidget 示例
      • StatefulWidget 示例

写在前面

🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。

👏🏻 正在学 Flutter 的同学,你好!

😊 Flutter 面试宝典是解决 Flutter 面试过程中可能出现的问题,而进行汇总整理的。一个问题一篇文章,优化答案,更适合面试过程中的口述满足实际面试需求

🔍 想解决开发中的高频零散问题?碎片化教程 👉 Flutter Tips

🔍 想深入学习 Flutter?系统化教程 👉 Flutter 从0到1 基础入门到应用上线全攻略 & 专栏指引

👥 快来和我们一起交流!👉 讨论群在这里,和大家一起进步!

解答

Flutter 中,构建界面的核心概念是 WidgetWidgets 是构建应用界面的基本组件,可以理解为用户界面的构建块。每个 Widget 都承担着在屏幕上绘制界面元素的角色,包括布局、颜色和交互等。

在 Flutter 的 Widget 体系中,存在两种主要类型的 Widgets:StatelessWidgetStatefulWidget

StatelessWidget 是一种不保持状态的 Widget。它描述了一种在给定的配置和环境下一成不变的界面。例如,一个图标、一段文本或一个按钮,这些都可能是 StatelessWidget 的例子。这些 Widget 本质上是不可变的,一旦它们被构建,它们的属性就不能再改变

相对地,StatefulWidget 允许您构建一个可以随时间发展和响应用户输入变化的 Widget。StatefulWidget 拥有一个 State 对象,用于存储其状态。当 Widget 的状态需要更新时,可以通过调用 setState() 方法来实现,这将触发框架重建 Widget,从而反映状态的更新。这使得 StatefulWidget 非常适合于那些需要动态变化的 UI 元素,比如计时器、表单以及具有复杂交互的页面等。

理解 StatelessWidget 和 StatefulWidget 之间的差异是至关重要的,因为它们决定了 Widget 如何渲染和重建。简而言之,如果你的 Widget 在整个生命周期内不需要改变其状态,那么使用 StatelessWidget;如果你的 Widget 需要根据用户交互或其他因素更改其外观或行为,那么使用 StatefulWidget。

补充说明

以下是两个示例,分别展示了如何使用 StatelessWidgetStatefulWidget 在 Flutter 中创建基本的用户界面。

StatelessWidget 示例

这个示例展示了一个简单的 StatelessWidget,它显示了一个文本消息。由于它是无状态的,所以这个 Widget 不会随时间改变。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

// 应用的根 Widget
class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Stateless Widget 示例'),
        ),
        body: Center(
          // 自定义的 Stateless Widget
          child: MessageDisplay(),
        ),
      ),
    );
  }
}

// 一个简单的 Stateless Widget,显示固定文本
class MessageDisplay extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Text(
      'Hello, Flutter!',
      style: TextStyle(fontSize: 24),
    );
  }
}

运行结果如下

StatefulWidget 示例

当然,这里有一个不同的 StatefulWidget 示例。这次我们将创建一个简单的计时器应用,当用户按下一个按钮时,计时器开始倒计时。这个例子展示了 StatefulWidget 如何用来响应用户的交互并更新界面。

import 'package:flutter/material.dart';
import 'dart:async';

void main() => runApp(MyApp());

// 应用的根 Widget
class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('StatefulWidget 计时器示例 By 小雨青年 CSDN'),
        ),
        body: Center(
          // 自定义的 Stateful Widget 计时器
          child: TimerWidget(),
        ),
      ),
    );
  }
}

// 自定义的 Stateful Widget
class TimerWidget extends StatefulWidget {
  
  _TimerWidgetState createState() => _TimerWidgetState();
}

// TimerWidget 的状态
class _TimerWidgetState extends State<TimerWidget> {
  int _seconds = 10; // 倒计时的秒数
  Timer? _timer; // 用于控制倒计时的计时器

  void _startTimer() {
    _seconds = 10; // 重置计时时间
    if (_timer != null) {
      _timer!.cancel(); // 如果计时器已经存在,先取消当前计时器
    }
    // 创建一个新的计时器
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      if (_seconds > 0) {
        setState(() {
          _seconds--; // 每秒钟减少秒数
        });
      } else {
        _timer!.cancel(); // 时间到达后取消计时器
      }
    });
  }

  
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          '倒计时: $_seconds 秒',
          style: TextStyle(fontSize: 24),
        ),
        ElevatedButton(
          onPressed: _startTimer,
          child: Text('开始倒计时'),
        ),
      ],
    );
  }

  
  void dispose() {
    _timer?.cancel(); // 释放计时器资源
    super.dispose();
  }
}

运行结果如下

在这个例子中,我们定义了一个 _TimerWidgetState 类来管理计时器的状态,包括剩余秒数和计时器对象。_startTimer 方法用来初始化或重置计时器,并在每秒减少 _seconds 变量的值。当倒计时完成时,计时器会自动停止。这个例子展示了如何在 StatefulWidget 中处理时间相关的逻辑,并根据时间变化更新 UI。


http://www.niftyadmin.cn/n/5430647.html

相关文章

Android图片加载-Glide4,Android多进程从头讲到尾

open fun load(context: WeakReference, url: String?, image: ImageView?, transformation: BitmapTransformation) { if (image null) return // 具体图片加载逻辑 } open fun load(holder: Int, context: WeakReference, url: String, image: ImageView?, width: Int, …

安卓kotlin面试题 91-100

91. 阐述Kotlin中性能优化之局部函数 ?就是像正常定义普通函数的语法一样,在其他函数体内部声明该函数。这些被称为局部函数,它们能访问到外部函数的作用域。 fun someMath(a: Int): Int { fun sumSquare(b: Int) = (a + b) * (a + b) return sumSquare(1) +…

【maven下载、安装、配置教程】

一、下载 maven 官网&#xff1a;Maven – Download Apache Maven 注意&#xff1a;idea 和 maven 的版本问题&#xff0c;不然 idea 启动项目会发生兼容性错误。如 2020 版本 idea 支持 3.6.3 左右的 maven 版本&#xff0c;用 3.9版本的 maven 会报错。 二、配置maven全局配置…

【机器学习】走进监督学习:构建智能预测模型的第一步

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

硬件笔记(26)---- 高速电路中滤波电容的选取

先要知道电容的等效电路 其中ESL取决于电容的类型和封装&#xff0c;一般用贴片陶瓷电容为例&#xff0c;对于直插式电解电容&#xff0c;他们的ESL很大。按下表&#xff0c;封装越大&#xff0c;ESL越大&#xff0c;但是0612有些例外 0612和1206就是 长短边的区别&#xff0c;…

【Vue3】Vue3中路由规则的 props 配置

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

B3620 x 进制转 10 进制(详解)

题目 思路 十进制数13怎么转为二进制数。许多人都知道用13一直除以2&#xff0c;取余数&#xff0c;最后反向将余数组合起来。 首先它是转二进制&#xff0c;我们都知道二进制数是逢二进一&#xff0c;所以我们就看看13有多少个2是吧&#xff0c;于是就用132得到6余1的结果&am…

简单分析SpringMVC的处理请求流程

SpringMVC的处理请求流程 Tomcat接收到一个请求后&#xff0c;会交给DispatcherServlet处理 DispatcherServlet会根据请求的url找到对应的Handler&#xff0c;Handler实际上是一个加了RequestMapping或GetMapping等类似注解的方法 在执行方法前会解析方法参数&#xff0c;即解…