【Flutter】还在手动写class xxxPage吗?快来用IDEA自带的的强大模板!File Templates

本文讲述了作者如何从AndroidStudio的Java模板转移到Flutter/Dart中的模板定制,包括如何找到并编辑模板文件,模仿和自定义Class文件和Widget模板,以及使用VTL语法进行文件名处理的过程。

前言

由于我自己是从Android原生转flutter,之前在Android Studio中写java代码时还没感受到模板的强大之处,在新建java的Class文件的时候,会自动生成"public class [文件名]"的样式模板,到了新建dart就没有自带的模板,每次都要手写class xxx,于是最近抽点时间研究了一下,果然是可以自定义模板的!而且远比之前强大,跟着我一起看看吧

实践

入口1

其实平时如果有好奇的同学喜欢观察就会发现,当我们新建文件时,有一个 Edit File Templates… 的选项,其实这就是修改模板的快捷入口了

image.png

入口2

除了快捷入口,当然也可以从工具栏进入,点击左上角的 File -> Settings -> Editor -> File and Code Templates
或者在Settings的搜索栏直接搜索 File and Code Templates,都可以

image.png

模仿

现在知道所有的模板文件是在这里定义了,那我们先去看看熟悉的Class文件的模板长什么样子吧!
image.png
打开一看,咦,怎么这个模板里还有代码,而且这个语法既陌生又熟悉呢?

这里介绍一下,这里模板使用的代码语法叫做 VTL(Velocity Templates Language) 点击右下角蓝色部分的Apache Velocity即可看到官方指南网页了,这里就不做详细介绍了。
简单说就是基于java的模板引擎,有点像jsp。

回过来看这个Class的模板代码,它干了什么事情呢,先看第一句

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

意思其实就是,如果存在PACKAGE_NAME且不等于"",则在文件第一行加上package PACKAGE_NAME,理解起来很简单

第二行看到可能会有点懵逼,这个File Header.java是哪来的,为啥要解析它

#parse("File Header.java")

其实这是官方预定义好的一个文件,在Includes的tab里,是一个空的文件,让用户可以自己再文件头里写好预备的注释,比如说作者信息,创建时间等等,加完这个我们再去创建一个新的Class文件就会自带注释了

image.png

image.png

第三行就一个${NAME},其实就是文件名

超越

目前为止,已经看懂了Class模板文件里的代码了,我们可以来搞搞自己的了,首先去看看dart文件里有什么默认的模板代码——

image.png
嗯??啥都没有,好吧,我们自己来,我们已经学会用文件名传递到模板文件里的方法了,这个简单,来
image.png
image.png
挠头,好像哪里不对,但是又好像都对。

这个类名很明显不是我们想要的,java文件的文件名和类名是直接对应的,直接使用文件名是可以的。但是dart的文件名采用lowercase+下划线的方式,直接使用文件名肯定是不行的,别慌,既然是用java写的模板代码,那肯定可以对文件名做点操作。直接给大家贴上代码吧!

#set($words = $NAME.split("_"))
#set($result = "")
#foreach($word in $words)
  #set($capitalizedWord = $word.substring(0,1).toUpperCase() + $word.substring(1))
  #set($result = $result + $capitalizedWord)
#end
class $result {
  
}

我自己也没细看VTL的语法,但是这段代码也不复杂,可以简单理解下

第一行就是把文件名用下划线分隔成一个集合,用变量words存起来

第二行声明一个result的空字符串

第三行就是遍历words,把首字母变成大写,然后再拼接到result中
,最后把result设置为文件名就大功告成了

来试一下成果!

image.png

image.png

举一反三

除了dart文件,在写flutter新建widget也需要写很多模板代码,虽然官方自带live templates的也很好用,但是既然我们都学会了怎么直接从文件名做模板,那就一步到位。

live templates:

image.png

这里直接贴我自己喜欢用的StatelessWidget和StatefulWidget模板吧,需要的同学自己改一改
Stateless:

import 'package:flutter/material.dart';
#set($words = $NAME.split("_"))
#set($result = "")
#set($word = "")
#foreach($word in $words)
  #set($capitalizedWord = $word.substring(0,1).toUpperCase() + $word.substring(1))
  #set($result = $result + $capitalizedWord)
#end

class $result extends StatelessWidget{

  @override
  Widget build(BuildContext context) {  
    return Scaffold(
      body: ,
    );
  }
}

StatefulWidget:

import 'package:flutter/material.dart';
#set($words = $NAME.split("_"))
#set($result = "")
#set($word = "")
#foreach($word in $words)
  #set($capitalizedWord = $word.substring(0,1).toUpperCase() + $word.substring(1))
  #set($result = $result + $capitalizedWord)
#end

class $result extends StatefulWidget {
  const $result({super.key});

  @override
  State<$result> createState() => _${result}State();
}

class _${result}State extends State<${result}> {

  @override
  Widget build(BuildContext context) {  
    return Scaffold(
      body: ,
    );
  }
}

生成模板如图:

image.png

image.png

在 `flutter_markdown` 库中,支持自定义 HTML 标签的渲染主要依赖于 `extensionSet` 和自定义的 `MarkdownElementBuilder`。通过扩展默认的 `ExtensionSet` 并注册自定义的标签解析规则,可以实现对 HTML 标签的识别和渲染。 ### 自定义 HTML 标签的解析 `flutter_markdown` 使用 `markdown` 包进行 Markdown 解析,而该包支持通过 `ExtensionSet` 添加自定义的 HTML 标签解析规则。以下是一个示例,展示如何支持自定义的 `<custom-tag>` 标签: ```dart import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:markdown/markdown.dart' as md; class CustomTagSyntax extends md.InlineSyntax { CustomTagSyntax() : super(r'<custom-tag>(.*?)</custom-tag>'); @override bool onMatch(md.InlineParser parser, Match match) { final text = match.group(1)!; parser.addNode(md.Element('custom', [md.Text(text)])); return true; } } ``` ### 自定义 HTML 标签的渲染 为了渲染自定义标签,需要使用 `MarkdownElementBuilder` 来定义如何将解析后的节点转换为 Flutter 小部件。以下是一个示例,展示如何将 `<custom-tag>` 渲染为带有特定样式的 `Container`: ```dart class CustomTagBuilder extends MarkdownElementBuilder { @override Widget visitElementAfter(md.Element element, TextStyle? preferredStyle, Widget child) { return Container( padding: const EdgeInsets.all(8.0), decoration: BoxDecoration( color: Colors.yellow, border: Border.all(color: Colors.orange), borderRadius: BorderRadius.circular(4.0), ), child: Text( element.textContent, style: const TextStyle(color: Colors.black), ), ); } } ``` ### 使用自定义解析和渲染逻辑 在 `Markdown` 组件中,通过 `extensionSet` 和 `elementBuilder` 属性启用自定义解析和渲染逻辑: ```dart Markdown( data: 'This is a <custom-tag>custom HTML tag</custom-tag> example.', extensionSet: md.ExtensionSet( md.ExtensionSet.gitHubWeb.blockSyntaxes, [ CustomTagSyntax(), ...md.ExtensionSet.gitHubWeb.inlineSyntaxes, ], ), elementBuilder: CustomTagBuilder(), ) ``` 上述代码中,`CustomTagSyntax` 用于识别 `<custom-tag>` 标签,而 `CustomTagBuilder` 则负责将其渲染为带有特定样式的 `Container` 小部件 [^1]。 ### 相关问题 1. 如何在 `flutter_markdown` 中添加自定义样式? 2. 如何在 `flutter_markdown` 中实现链接点击事件? 3. 如何在 `flutter_markdown` 中支持自定义的 Markdown 语法? 4. 如何在 Flutter 应用中使用 `flutter_markdown` 显示代码块? 5. 如何在 Flutter 中使用 `flutter_markdown` 库渲染数学公式?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TDSSS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值