【Flutter 工程】004-代码生成:functional_widget

news2024/11/30 0:42:23

【Flutter 工程】004-代码生成:functional_widget

文章目录

  • 【Flutter 工程】004-代码生成:functional_widget
  • 一、概述
    • 1、Flutter 开发痛点
    • 2、functional_widget 函数小部件
    • 3、主页
  • 二、基本使用
    • 1、安装 functional_widget
    • 2、传统写法
    • 3、运行结果
    • 4、代码改造
    • 5、代码生成
      • 命令
      • 生成的代码
    • 6、运行结果

一、概述

1、Flutter 开发痛点

部件代码冗长

class Foo extends StatelessWidget {
  final int value;
  final int value2;

  const Foo({Key key, this.value, this.value2}) : super(key: key);

  
  Widget build(BuildContext context) {
    return Text('$value $value2');
  }
}

使用普通函数可以更好地完成某些事情的代码

Widget foo(BuildContext context, { int value, int value2 }) {
  return Text('$value $value2');
}

但不推荐这么做!因为 Flutter 能够对类组件进行 const 优化,如果使用函数的话会丧失这种优化!

2、functional_widget 函数小部件

写完函数,生成对应的小部件!

functional_widget是一个用于 Flutter 应用程序的第三方包,它提供了一种简化小部件创建的方式,称为函数式小部件(Functional Widgets)。

在传统的Flutter开发中,创建小部件通常需要编写一个继承自StatelessWidgetStatefulWidget的类,并实现其build方法来描述小部件的外观和行为。这种方式需要编写较多的模板代码,尤其是对于简单的小部件而言。

functional_widget包通过引入函数式小部件的概念,提供了一种更简洁和直观的方式来创建小部件。使用函数式小部件,您可以将小部件的外观和行为直接定义在一个函数内部,而无需创建一个独立的类。

使用functional_widget,您可以使用注解来标记函数,使其成为一个函数式小部件。该注解会生成一个相应的小部件类,将函数的实现转换为该类的build方法。这样,您就可以像使用普通小部件一样在您的应用程序中使用函数式小部件。

函数式小部件具有以下优点:

  1. 简洁性:您可以将小部件的实现直接定义在一个函数内部,避免编写独立的类和模板代码。
  2. 可读性:函数式小部件更加直观和紧凑,使得代码更易于阅读和理解。
  3. 可组合性:函数式小部件可以轻松地组合和嵌套,使得构建复杂的用户界面变得更加灵活和便捷。

functional_widget包不仅提供了函数式小部件的注解,还提供了一些其他的辅助函数和工具,用于进一步简化和优化小部件的创建过程。

总的来说,functional_widget是一个实用的工具包,可帮助开发者以一种更加简洁和直观的方式创建Flutter小部件。它提供了函数式小部件的概念,并通过注解和工具简化了小部件的创建和使用过程。使用functional_widget可以提高代码的可读性和可维护性,同时减少样板代码的编写量。

3、主页

https://pub.flutter-io.cn/packages/functional_widget

二、基本使用

1、安装 functional_widget

flutter pub add dev:functional_widget dev:build_runner functional_widget_annotation

2、传统写法

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

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

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: const Center(
        child: Text("hello world!", style: TextStyle(fontSize: 40),),
      ),
    );
  }
}

3、运行结果

image-20230526140617497

4、代码改造

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

part 'main.g.dart';

void main() {
  runApp(const MyApp());
}

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

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: const Center(
        child: MyText("Hello World"),
      ),
    );
  }
}


Widget myText(String value) {
  return Text(
    value,
    style: const TextStyle(fontSize: 40),
  );
}

5、代码生成

命令

# --delete-conflicting-outputs 可选,会在生成代码冲突的时候,删除原来的代码,重新生成
flutter pub run build_runner build --delete-conflicting-outputs

生成的代码

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'main.dart';

// **************************************************************************
// FunctionalWidgetGenerator
// **************************************************************************

class MyText extends StatelessWidget {
  const MyText(
    this.value, {
    Key? key,
  }) : super(key: key);

  final String value;

  
  Widget build(BuildContext _context) => myText(value);
}

6、运行结果

image-20230526152125183

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

App Inventor 2 连接打印机(Printer),自定义打印的实现

本教程主要分享App Inventor 2连接网络打印机进行自定义打印的思路及方法&#xff0c;这里只进行思路的讲解及关键步骤的效果演示&#xff0c;细节需自行完善。主要用到社交应用组件中的信息分享器组件。 打印App示意图 连接打印机教程&#xff08;难度系数&#xff1a;★★&a…

值得尝试的Voyager Linux,没有Snap,出色的定制

一直以来我都不喜欢 Ubuntu GNOME 的默认外观&#xff0c;而且对Ubuntu强制使用Snap应用不是很喜欢&#xff0c;之前我用的是Ubuntu MATE这个发行版&#xff0c;直到我听说了Voyager Linux。今天特意安装试用了一下Voyager Linux 23.04&#xff0c;有几点功能我很喜欢&#xff…

适用于 Windows 电脑的 6 款最佳视频转换器

视频转换器可以帮助您转换和播放设备上不受支持的视频格式。减小视频文件大小、以通用格式组织所有视频或与他人共享文件以在不同设备上播放也很方便。 Windows 有很多视频转换器可供选择。有些是免费的&#xff0c;有些则提供适合专业用户的高级功能。在本指南中&#xff0c;…

Java程序设计入门教程--Java语言概述

目录 1.1 Java语言诞生与发展 1.2 Java语言的特点 1.3 运行机制与虚拟机 1.1 Java语言诞生与发展 Java语言的诞生最早可以追溯至1991年&#xff0c;那时称为OAK语言&#xff0c;是SUN公司为一些消费性电子产品而设计的一个通用环境&#xff0c;其最初目的只是为了开发一种独…

完美解决接口测试难题,数据驱动带签名混合封装框架实现

目录 前言&#xff1a; 一、框架概述 二、框架架构 三、代码实现 四、实战步骤 五、总结 前言&#xff1a; 接口自动化测试是保障软件质量的重要手段之一&#xff0c;其自动化程度越高&#xff0c;越能有效提高软件测试效率。而接口自动化测试中&#xff0c;接口测试框架…

推荐 6 款还不错的文档协作工具~

你们团队是否正在寻找便捷丰富功能的文档协作软件&#xff1f; 文件协作软件帮助你和你的团队更有效地工作&#xff0c;并进行实时协作&#xff0c;为创新创造更多的空间。 但是&#xff0c;今天有数百种文档协作工具&#xff0c;你应该选择哪一种呢&#xff1f; 为了帮助你…

SpringSecurity的认证原理及如何自定义认证结合MyBatis替换原数据源

文章目录 一、自定义认证二、自定义登录界面三、自定义成功的处理1、前后端分离返回json 四、如何在前端显示异常1、传统的方法2、前后端分离返回错误的json 五、注销登录配置1、注销登录前后端不分离2、前后端分离的方法 六、登录⽤户数据获取1、SecurityContextHolder2、Secu…

【Netty】Netty 程序引导类(九)

文章目录 前言一、引导程序类二、AbstractBootStrap 抽象类三、Bootstrap 类四、ServerBootstrap 类五、引导服务器5.1、 实例化引导程序类5.2、设置 EventLoopGroup5.3、指定 Channel 类型5.4、指定 ChannelHandler5.5、设置 Channel 选项5.6、绑定端口启动服务 六、引导客户端…

STL-reverse_iterator 反向迭代器

回顾 对于STL中的容器&#xff0c;迭代器(iterator)是很重要的部分&#xff0c;同时迭代器也是STL六大组件之一&#xff0c;在之前我们实现vector和list中&#xff0c;我们已经对于迭代器有了初步的认识&#xff0c;为什么设计迭代器&#xff1f; 就是为了能像数组中的指针一样…

虹科干货|创新求变:虹科Redis企业版数据库驱动金融实时业务

BDO调查显示&#xff0c;43%的金融企业正计划全力加速数字化转型&#xff0c;互联网巨头与金融科技初创公司正在颠覆传统。”与此同时&#xff0c;客户行为、消费习惯和期望持续变化&#xff0c;以客户为中心的快速金融服务已成趋势&#xff0c;企业微服务、云原生应用亟需一组…

【算法题解】30. 全排列的递归解法

这是一道 中等难度 的题 https://leetcode.cn/problems/permutations/ 题目 给定一个不含重复数字的数组 n u m s nums nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1…

景点解说二维码怎么做?一键教你轻松生成二维码

现在的各种景区为了节省人工都会将景点的详细讲解做成二维码。通过手机扫码就能自助导览。那么&#xff0c;大家知道这种景区讲解二维码是怎么制作的吗&#xff1f; 一、什么工具能制作二维码图片&#xff1f; 机智熊二维码生成器&#xff08;https://www.jzx.com/&#xff09;…

什么是高性能计算实习生?做高性能计算有前景吗?

随着大模型和算力时代的大火&#xff0c;高性能计算实习的岗位越来越多了&#xff0c;各个大厂都在码人&#xff0c;百度、小米、字节、华为等等&#xff0c;也有很多网友晒出了面试一众知名芯片企业的面经和笔试题。 但是依然有很多朋友不清楚什么是高性能计算实习生&#xf…

搜索推荐系统[10]项目实战系列Z1:手把手教学(商品搜索系统、学术文献检索)语义检索系统搭建、召回排序模型详解。

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

每日一练 | 网络工程师软考真题 Day12

阅读以下说明&#xff0c;答复以下【问题1】至【问题3】 【说明】 某单位有1个总部和6个分部&#xff0c;各个部门都有自己的局域网。该单位申请了6个C类IP地址202.115.10.0/24~202.115.15.0/24&#xff0c;其中总部与分部4共用一个C类地址。现方案将这些部门用路由器互联&…

linuxOPS基础_操作系统概述

计算机发展史 第一台计算机是1946 年2 月14 日诞生日&#xff0c;第一台名称ENIAC。体积一间屋子的大小&#xff0c;重量高达28t。 第一代&#xff1a;1946 – 1958 > 12 年 &#xff08;电子管&#xff09; 第二代&#xff1a;1958 – 1964 > 6 年 &#xff08;晶体管…

VR数字展厅——助力商企实现数字化营销展示

近年来&#xff0c;随着元宇宙、虚拟现实等概念逐渐进入大众视野&#xff0c;VR虚拟展厅也慢慢的发展成为了一种新的展示形式。VR数字展厅可以将展示场景复刻在线上&#xff0c;不再受限于线下环境&#xff0c;随着VR全景技术的高速发展&#xff0c;虚拟展厅帮助商企实现更具创…

一起CPU很闲,load却很大的案例分析

1、软硬件环境 硬件&#xff1a; 飞腾E2000Q 平台 软件&#xff1a; linux 4.19.246 2、问题现象 系统在上电后&#xff0c;无意中发现系统的平均负载很大&#xff0c;数值显示远超过cpu的承载能力。心想也没有跑什么业务程序呀&#xff0c;吓得赶紧运行top命令&#xff0c;瞅…

无人车端到端驾驶模型概述

摘要&#xff1a; 通常&#xff0c;端到端驾驶模型使用一个深度神经网络来完成这种映射&#xff0c;网络的所有参数为联合训练而得。这种方法因它的简洁高效而引人关注。 引言 在搭建无人车时&#xff0c;我和小伙伴们的主要工作是建立一个驾驶模型。所谓的驾驶模型是控制无人…

idea模板配置

idea版本&#xff1a;2023.1 未设置模板的idea&#xff0c;新建类会自动生成类注释 格式如下&#xff1a; /*** author user* date 2023/5/20 0020 14:25*/ public class User {} 其中&#xff0c;user为当前用户名 这里&#xff0c;如果希望将类注释改写成如下&#xff0…