NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • nodejs

  • css

  • 最佳实践

  • TypeScript

  • ajax

  • JavaScript

  • 前端工程化

  • React

  • nextjs

  • Flutter

    • 教程

      • 概念与安装
      • Dart语言
      • 解读示例项目
      • Widget
        • 概念
        • Widget 抽象类
        • StatelessWidget类(无状态)
          • Context
  • 笔记

  • 前端
  • Flutter
  • 教程
NipGeihou
2024-09-25
目录

Widget

# 概念

Flutter 中的 widget 的概念更广泛,它不仅可以表示 UI 元素,也可以表示一些功能性的组件如:用于手势检测的 GestureDetector 、用于 APP 主题数据传递的 Theme 等等,而原生开发中的控件通常只是指 UI 元素。

避免绕晕,此时只需简单的认为 widget 就是前端框架中的组件,组件可以嵌套组件,widget 可以嵌套 widget,下文中讲到 “组件”、“控件” 时均指 widget。

# Widget 抽象类

在下文中讲到的 StatelessWidget 、 StatefulWidget 类都是直接继承自 Widget 类,只需记住:

abstract class Widget extends DiagnosticableTree {
  const Widget({ this.key });

  final Key? key;
    
    ...
}
  • 在 Widget 抽象类中定义了一个 key 属性,需要通过构造函数传递,而这个 key 的作用是决定是否在下一次 build 时复用旧的 widget ,决定的条件在 canUpdate() 方法中。

# StatelessWidget 类(无状态)

简单说就是这个组件不会因为某个 data 的变化而变化,就是一个纯粹的静态组件。

class Echo extends StatelessWidget  {
  const Echo({
    Key? key,  
    required this.text,
    this.backgroundColor = Colors.grey, //默认为灰色
  }):super(key:key);
    
  final String text;
  final Color backgroundColor;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: backgroundColor,
        child: Text(text),
      ),
    );
  }
}

# Context

可从中获取父组件的一些数据

class ContextRoute extends StatelessWidget  {
  const ContextRoute({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Context测试"),
      ),
      body: Builder(builder: (context){
       Scaffold? scaffold =  context.findAncestorWidgetOfExactType<Scaffold>();
       return (scaffold?.appBar as AppBar).title as Widget;
      }),
    );

  }

}
上次更新: 2024/10/15, 11:00:25
解读示例项目
组件库

← 解读示例项目 组件库→

最近更新
01
Docker Swarm
04-18
02
安全隧道 - gost
04-17
03
Solana最佳实践
04-16
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式