当前位置: 首页 > news >正文

网页设计网站图片如何做网站店铺的模板

网页设计网站图片,如何做网站店铺的模板,房地产开发公司名字,网站正在建设中 敬请期待学习flutter代码 实现一个用于输入验证码的自定义组件#xff0c;它允许用户输入固定长度的验证码#xff0c;并在输入完成时触发回调。 前置知识点学习 TextStyle TextStyle 是 Flutter 中用于定义文本样式的类。它提供了一组属性来控制文本的外观#xff0c;如字体大小、…学习flutter代码 实现一个用于输入验证码的自定义组件它允许用户输入固定长度的验证码并在输入完成时触发回调。 前置知识点学习 TextStyle TextStyle 是 Flutter 中用于定义文本样式的类。它提供了一组属性来控制文本的外观如字体大小、颜色、粗细、字间距等。TextStyle 是 Flutter 应用中处理文本样式的核心部分通过它可以实现丰富的文本展示效果。 TextStyle 的主要属性 1.color: 设置文本的颜色。可以使用 Colors 类提供的颜色常量或自定义颜色。 2.fontSize: 设置文本的字号大小以逻辑像素为单位。 3.fontWeight: 定义文本的粗细程度。可以使用 FontWeight 枚举如 FontWeight.bold。 4.fontStyle: 设置文本的样式正常或斜体。可以使用 FontStyle 枚举如 FontStyle.italic。 5.letterSpacing: 设置字母之间的间距。 6.wordSpacing: 设置单词之间的间距。 7.fontFamily: 指定文本所使用的字体系列。可以是系统字体也可以是自定义字体。 8.backgroundColor: 文本的背景颜色。 9.decoration: 为文本添加装饰如下划线、上划线或删除线。可以使用 TextDecoration 枚举。 10.decorationColor: 文本装饰的颜色。 11.decorationStyle: 定义装饰线的样式如实线、虚线等。可以使用 TextDecorationStyle 枚举。 12.height: 行高相对于字体大小的倍数。 示例代码 以下是一个使用 TextStyle 的示例展示了如何应用各种样式属性 import package:flutter/material.dart;class TextStyleExample extends StatelessWidget {const TextStyleExample({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(TextStyle Example),),body: const Center(child: Text(Hello, Flutter!,style: TextStyle(color: Colors.blue,fontSize: 24.0,fontWeight: FontWeight.bold,fontStyle: FontStyle.italic,letterSpacing: 2.0,wordSpacing: 4.0,fontFamily: Roboto,decoration: TextDecoration.underline,decorationColor: Colors.red,decorationStyle: TextDecorationStyle.dashed,),),),);}} 代码解析 颜色与大小color: Colors.blue 和 fontSize: 24.0 分别设置了文本的颜色和字号。 字体粗细与样式使用 fontWeight: FontWeight.bold 使文本加粗fontStyle: FontStyle.italic 设置为斜体。 字间距与单词间距letterSpacing: 2.0 增加字母间距wordSpacing: 4.0 增加单词间距。 字体系列fontFamily: Roboto 指定文本使用 Roboto 字体系列。 文本装饰decoration: TextDecoration.underline 添加下划线decorationColor: Colors.red 和 decorationStyle: TextDecorationStyle.dashed 分别设置装饰线的颜色和样式。字体加载当使用自定义字体时确保在 pubspec.yaml 文件中正确配置字体资源并在项目中包含字体文件。这将确保在所有平台上正确加载和显示自定义字体。 flutter:fonts:- family: Robotofonts:- asset: fonts/Roboto-Regular.ttf- asset: fonts/Roboto-Bold.ttfweight: 700 性能考虑在大量文本或频繁更新文本样式的情况下尽量减少不必要的样式变化以提高性能。使用相同的 TextStyle 实例可以减少构建时间。 继承与覆盖TextStyle 支持通过 copyWith 方法创建一个新的样式对象可以在现有样式的基础上进行局部修改 TextStyle baseStyle TextStyle(fontSize: 20.0, color: Colors.black); TextStyle newStyle baseStyle.copyWith(color: Colors.red); 这在需要在不同部分稍微调整样式时非常有用。 样式优先级如果 TextStyle 被应用于 Text 小部件而 Text 小部件又嵌套在一个使用 DefaultTextStyle 的父小部件中那么 Text 小部件的 TextStyle 将覆盖 DefaultTextStyle 的样式。 实际应用中的建议 使用主题在大型应用中使用 ThemeData 来统一管理文本样式可以通过 Theme.of(context).textTheme 获取预定义的文本样式。这样可以保持应用风格的一致性。 Text(Themed Text,style: Theme.of(context).textTheme.headline6, ); 响应式设计在处理需要适配不同屏幕尺寸的文本时可以结合 MediaQuery 或使用 flutter_screenutil 这样的库根据屏幕尺寸动态调整 fontSize。 国际化与本地化在处理多语言支持时确保字体和样式可以适应不同的字符集和语言特性。例如某些语言可能需要更大的行高或不同的字体。 通过对 TextStyle 的深入理解你可以在 Flutter 应用中创建美观、统一且响应式的文本展示效果。它是 Flutter UI 构建中不可或缺的一部分熟练掌握它将帮助你更好地设计和实现高质量的用户界面。 ClipRRect ClipRRect 是 Flutter 中的一个小部件用于将其子组件裁剪为圆角矩形的形状。它非常适合在需要为组件添加圆角效果时使用比如为图片、容器等添加圆角。ClipRRect 通过使用 RRect圆角矩形来定义裁剪的形状。 主要属性 1.borderRadius: 类型BorderRadius 用于定义圆角的半径可以指定每个角的圆角大小。 示例BorderRadius.circular(8.0) 会为所有角设置 8.0 的圆角。 2.clipBehavior: 类型Clip定义裁剪行为。常用值包括 Clip.none、Clip.hardEdge、Clip.antiAlias 和 Clip.antiAliasWithSaveLayer。 Clip.antiAlias 和 Clip.antiAliasWithSaveLayer 提供更平滑的边缘但可能会影响性能。 3.child: 被裁剪的子组件。可以是任何类型的 Widget。 使用场景 应用圆角效果为图片、按钮、容器等应用圆角效果。 嵌套裁剪在需要复杂形状裁剪的场合可以结合其他裁剪小部件如 ClipOval使用。 示例代码 下面是一个简单的 ClipRRect 使用示例将一张图片裁剪为圆角矩形 import package:flutter/material.dart;class ClipRRectExample extends StatelessWidget {const ClipRRectExample({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(ClipRRect Example),),body: Center(child: ClipRRect(borderRadius: BorderRadius.circular(16.0),child: Image.asset(static/demo.png,width: 200,height: 200,fit: BoxFit.cover,),),),);} }代码解析 borderRadius: 使用 BorderRadius.circular(16.0) 为图片的四个角应用了 16.0 的圆角。 child: 包含了一张通过网络加载的图片。ClipRRect 将这张图片裁剪成带有圆角的矩形。 性能考虑 裁剪性能使用 ClipRRect 时clipBehavior 会影响性能尤其是在需要抗锯齿或使用 saveLayer 时。在性能敏感的场景中尽可能选择 Clip.hardEdge因为它是最快的选项。 避免不必要的裁剪如果可以通过布局或其他方式实现相同的效果尽量避免使用 ClipRRect因为裁剪操作会增加渲染开销。 总结 ClipRRect 是 Flutter 中用于实现圆角裁剪的强大工具。通过它可以轻松地为任何组件添加圆角效果使得应用的视觉效果更加美观和现代。在使用时需要注意裁剪的性能影响合理选择裁剪行为以达到最佳的性能和平滑度平衡。 AnimatedContainer AnimatedContainer 是 Flutter 中一个非常有用的小部件它在属性发生变化时可以自动动画化地过渡到新的属性。这使得创建动画效果和响应式界面变得非常简单无需手动管理动画控制器或状态。 特性与属性 1.duration: 类型Duration指定动画过渡的持续时间。必须设置这个属性来定义动画的长短。示例Duration(seconds: 1) 表示动画持续一秒。 2.curve: 类型Curve定义动画的曲线决定了动画的加速度和减速度。常用曲线有 Curves.easeIn、Curves.easeOut、Curves.bounceIn 等。示例Curves.easeInOut 表示动画以缓慢的速度开始和结束但中间速度较快。 3.alignment: 控制子组件的对齐方式。 4.padding: 控制内部填充。 5.color: 背景颜色。 6.decoration 和 foregroundDecoration: decoration 用于背景装饰例如边框、圆角、渐变等。foregroundDecoration 用于在子组件前的装饰。 7.width 和 height: 控制容器的宽度和高度。 8.constraints: 设置容器的大小限制例如最小和最大宽高。 9.margin: 控制外部间距。 10.transform: 应用于子组件的变换例如旋转、缩放、平移等。 11.child: 被包裹的子组件。 使用场景 动画化尺寸变化在用户交互后动态调整组件的大小。 背景颜色过渡在状态改变时平滑地过渡到新的背景颜色。 位置和边距动画在布局中通过调整位置和边距来创建动画效果。 示例代码 import package:flutter/material.dart;class AnimatedContainerExample extends StatefulWidget {const AnimatedContainerExample({super.key});override_AnimatedContainerExampleState createState() {return _AnimatedContainerExampleState();} }class _AnimatedContainerExampleState extends StateAnimatedContainerExample {double _width 100.0;double _height 100.0;Color _color Colors.blue;overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(AnimatedContainer Example),),body: Center(child: GestureDetector(onTap: () {setState(() {_width _width 100.0 ? 200.0 : 100.0;_height _height 100.0 ? 200.0 : 100.0;_color _color Colors.blue ? Colors.red : Colors.blue;});},child: AnimatedContainer(width: _width,height: _height,color: _color,alignment: Alignment.center,duration: const Duration(seconds: 1),curve: Curves.easeInOut,child: const Text(Tap me!,style: TextStyle(color: Colors.white, fontSize: 20.0),),),),),);} }BoxDecoration BoxDecoration 是 Flutter 中用于装饰容器如 Container的一个类。它提供了一系列属性允许你为容器添加背景颜色、渐变、图像、边框、阴影等装饰效果。BoxDecoration 结合 Container 使用可以打造出丰富的视觉效果。 主要属性 1.color: 类型Color 设置容器的背景颜色。 2.image: 类型DecorationImage用于在容器背景中绘制图像。 可以指定图像的对齐方式、填充方式等。 3.border: 类型Border 为容器添加边框。可以指定每条边的宽度和颜色。 4.borderRadius: 类型BorderRadius 设置容器的圆角半径。 5.boxShadow: 类型List 为容器添加阴影效果。可以指定阴影的颜色、偏移、模糊半径等。 6.gradient: 类型Gradient 为容器添加渐变背景。支持线性渐变、径向渐变等。 7.backgroundBlendMode: 类型BlendMode 设置背景颜色和图像的混合模式。 8.shape: 类型BoxShape 指定容器的形状。可以是矩形默认或圆形。 使用场景 背景颜色和图像为容器添加背景颜色或图像。 边框和圆角为容器添加边框和圆角效果。 阴影效果为容器添加阴影提升视觉层次感。 渐变背景使用渐变色为背景打造现代化的视觉效果。 示例代码 以下是一个使用 BoxDecoration 的示例展示了如何为容器添加背景颜色、圆角、边框和阴影 import package:flutter/material.dart;class BoxDecorationExample22 extends StatelessWidget {const BoxDecorationExample22({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(BoxDecoration Example),),body: Container(width: 200.0,height: 200.0,decoration: BoxDecoration(color: Colors.blue[200],borderRadius: BorderRadius.circular(20.0),border: Border.all(color: Colors.blue,width: 3.0,),boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.5),spreadRadius: 5,blurRadius: 7,offset: const Offset(0, 3), // changes position of shadow),],),child: const Center(child: Text(Hello, Flutter!,style: TextStyle(color: Colors.white, fontSize: 20.0),),),),);} }TextInputFormatter TextInputFormatter 是 Flutter 中用于在用户输入文本时进行格式化和验证的一个抽象类。它允许你在文本被输入到文本字段之前对其进行修改或限制这对于实现自定义的输入行为如限制输入类型或长度非常有用。 主要属性和方法 formatEditUpdate: 方法TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) 这是 TextInputFormatter 的核心方法必须被重写。它接收旧的文本值和新的文本值返回一个格式化后的文本值。 TextEditingValue 包含文本字段的当前状态包括文本内容、光标位置和选择范围。 常用子类 1.LengthLimitingTextInputFormatter: 用于限制输入文本的最大长度。 构造时传入一个整数表示最大长度。 示例LengthLimitingTextInputFormatter(10) 限制输入长度为 10 个字符。 2.FilteringTextInputFormatter: 用于过滤输入的文本只允许符合特定模式的输入。提供了 FilteringTextInputFormatter.digitsOnly 来限制输入仅为数字。 可以通过自定义正则表达式来实现更复杂的过滤。 示例代码 以下是如何使用 LengthLimitingTextInputFormatter 和 FilteringTextInputFormatter 的示例 import package:flutter/material.dart; import package:flutter/services.dart;class TextInputFormatterExampleDemo extends StatelessWidget {const TextInputFormatterExampleDemo({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(TextInputFormatter Example),),body: Padding(padding: const EdgeInsets.all(16.0),child: Column(children: [TextField(decoration: const InputDecoration(labelText: Limited Length (Max 10),),inputFormatters: [LengthLimitingTextInputFormatter(10),],),const SizedBox(height: 20,),TextField(decoration: const InputDecoration(labelText: Digits Only,),keyboardType: TextInputType.number,inputFormatters: [FilteringTextInputFormatter.digitsOnly,],)],),),);} }代码解析 限制输入长度第一个文本字段使用 LengthLimitingTextInputFormatter(10) 限制输入最大长度为 10 个字符。 限制输入内容第二个文本字段使用 FilteringTextInputFormatter.digitsOnly 限制输入仅为数字。 自定义格式化器 你可以通过继承 TextInputFormatter 并重写 formatEditUpdate 方法来创建自定义的输入格式化器。例如创建一个格式化器来限制输入只能是大写字母 class UpperCaseTextInputFormatter extends TextInputFormatter {overrideTextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {return TextEditingValue(text: newValue.text.toUpperCase(),selection: newValue.selection,);} } 使用场景 限制输入的类型和格式例如只允许字母、数字或特定符号。 验证用户输入的格式是否符合特定规则如电子邮件、电话号码。 动态调整用户输入使其符合特定格式。 TextField TextField 是 Flutter 中用于获取用户文本输入的一个重要组件。它提供了强大的功能和高度的可定制性使开发者能够轻松地集成和管理用户输入。下面是对 TextField 的详细解析。 基本特性 1.文本输入TextField 是用于用户输入文本的基本组件。 2.键盘类型可以通过 keyboardType 属性设置输入时弹出的键盘类型例如数字键盘、邮件键盘等。 3.样式和装饰通过 decoration 属性可以自定义 TextField 的外观包括提示文本、边框、标签等。 4.控制器使用 TextEditingController 来管理和监听文本输入的变化。 5.输入格式化使用 inputFormatters 来限制和格式化用户输入例如限制输入长度或只允许数字输入。 6.焦点控制通过 FocusNode 可以控制和监听 TextField 的焦点状态。 主要属性 controller: TextEditingController 用于读取、设置和监听 TextField 的文本。 focusNode: FocusNode 用于管理和监听焦点状态。 decoration: InputDecoration 用于定义 TextField 的外观和样式。 keyboardType: TextInputType 确定输入时使用的键盘类型。 textInputAction: TextInputAction 确定操作按钮的类型如“下一步”或“完成”。 onChanged: 输入内容更改时的回调函数。 onSubmitted: 用户提交按下“完成”键时的回调函数。 inputFormatters: TextInputFormatter 用于格式化输入文本。 obscureText: 用于密码输入隐藏输入的字符。 maxLength: 限制最大输入长度。 示例代码 以下是一个基本的 TextField 示例展示了如何使用控制器、装饰器和输入格式化器 import package:flutter/material.dart; import package:flutter/services.dart;class TextFieldExample extends StatefulWidget {const TextFieldExample({super.key});override_TextFieldExampleState createState() {return _TextFieldExampleState();} }class _TextFieldExampleState extends StateTextFieldExample {final TextEditingController _controller TextEditingController();final FocusNode _focusNode FocusNode();overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(TextField Example),),body: Padding(padding: const EdgeInsets.all(16.0),child: Column(children: [TextField(controller: _controller,focusNode: _focusNode,decoration: const InputDecoration(labelText: Enter your text,border: OutlineInputBorder(),),keyboardType: TextInputType.text,textInputAction: TextInputAction.done,onChanged: (text) {print(Current text: $text);},onSubmitted: (text) {print(Submitted text: $text);},inputFormatters: [LengthLimitingTextInputFormatter(20),FilteringTextInputFormatter.allow(RegExp(r[a-zA-Z0-9])),],),const SizedBox(height: 20),ElevatedButton(onPressed: () {// 打印当前文本框中的文本print(Final text: ${_controller.text});// 移除焦点使键盘消失_focusNode.unfocus();},child: const Text(Print Text and Unfocus),),],)),);} }代码解析 TextEditingController: 用于管理 TextField 的文本。可以通过 _controller.text 获取或设置输入文本。 FocusNode: 管理 TextField 的焦点状态。使用 _focusNode.unfocus() 可以移除焦点通常用于隐藏键盘。 InputDecoration: 自定义 TextField 的外观例如标签文本和边框。 inputFormatters: 使用 LengthLimitingTextInputFormatter 限制输入长度以及 FilteringTextInputFormatter.allow 限制输入内容为字母和数字。 keyboardType: 设置为 TextInputType.text用于一般文本输入。 textInputAction: 设置为 TextInputAction.done表示用户完成输入时的操作。 事件回调: onChanged 和 onSubmitted 允许在用户输入或提交时执行操作。 附加功能和用法 密码输入: 设置 obscureText: true 可以隐藏输入的字符用于密码输入框。 多行输入: 通过设置 maxLines 属性可以允许 TextField 输入多行文本。 文本样式: 使用 style 属性自定义文本的外观例如字体大小和颜色。 错误信息: 使用 errorText 属性在 InputDecoration 中显示错误信息。 自动填充: 在 Android 和 iOS 上TextField 支持自动填充功能可以通过 autofillHints 配置。 Border 在 Flutter 中Border 是一个非常重要的类用于定义组件如容器、按钮或输入框周围的边框。它提供了多种方式来自定义边框的样式、颜色和宽度。理解 Border 的各种属性和用法有助于创建更具吸引力和功能性的 UI。 Border 类的基本概念 Border 类通常用于定义一个组件的四个边的样式。它通常与 BoxDecoration 一起使用以应用于 Container 或其他需要边框的组件。 主要属性 top、bottom、left、right: 每个边框的样式通过 BorderSide 定义可以设置颜色、宽度和样式。 all: 使用同样的边框值应用到所有边。 symmetric: 为水平和垂直方向的边设置对称的边框。 BorderSide 类 BorderSide 是用来描述边框的样式的类包含以下属性 color: 边框的颜色。 width: 边框的宽度默认为 1.0。 style: 边框的样式BorderStyle.solid实线或 BorderStyle.none无边框。‘’ 使用示例 以下是如何使用 Border 和 BorderSide 来自定义 Container 的边框 import package:flutter/material.dart;class BorderExampleDemo extends StatelessWidget {const BorderExampleDemo({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(Border Example),),body: Center(child: Container(width: 200,height: 200,decoration: BoxDecoration(color: Colors.blue[50],border: const Border(top: BorderSide(color: Colors.blue,width: 3.0,style: BorderStyle.solid,),bottom: BorderSide(color: Colors.green,width: 5.0,style: BorderStyle.solid,),left: BorderSide(color: Colors.red,width: 2.0,style: BorderStyle.solid,),right: BorderSide(color: Colors.orange,width: 4.0,style: BorderStyle.solid,),)),),),);} }代码解析 BoxDecoration: 用于定义 Container 的视觉外观包括颜色和边框。 Border: 使用 Border 类为 Container 的每一侧定义不同的 BorderSide。 BorderSide: 描述了每个边的颜色、宽度和样式。 常用方法 Border.all(): 创建一个统一的边框所有边的样式相同。 decoration: BoxDecoration(border: Border.all(color: Colors.black,width: 2.0,), ), Border.symmetric(): 为水平horizontal和垂直vertical方向定义对称的边框。 decoration: BoxDecoration(color: Colors.yellow[50],border: Border.symmetric(vertical: BorderSide(color: Colors.red,width: 4.0,),horizontal: BorderSide(color: Colors.blue,width: 2.0,),),), BorderRadius BorderRadius 是 Flutter 中用于定义圆角矩形的类。它可以用于将边框、容器和其他矩形形状的角变圆。BorderRadius 提供了多种方法来定义角的圆度允许你为每个角指定不同的半径也可以为所有角指定相同的半径。 主要构造方法 1.BorderRadius.circular(double radius): 为所有角设置相同的圆角半径。这个方法是最常用的适合需要统一圆角的情况。 2.BorderRadius.all(Radius radius): 使用 Radius 对象为所有角设置相同的半径。 3.BorderRadius.only({Radius topLeft, Radius topRight, Radius bottomLeft, Radius bottomRight}): 分别为每个角设置不同的半径提供了最大的灵活性。 4.BorderRadius.horizontal({Radius left, Radius right}): 仅为水平的两个角设置半径。 5.BorderRadius.vertical({Radius top, Radius bottom}): 仅为垂直的两个角设置半径。 示例代码 以下是如何使用 BorderRadius 的一些示例 1. 使用 BorderRadius.circular import package:flutter/material.dart;class CircularBorderExample extends StatelessWidget {const CircularBorderExample({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(Circular Border Example)),body: Center(child: Container(width: 200,height: 200,decoration: BoxDecoration(color: Colors.blue[100],borderRadius: BorderRadius.circular(20.0), // 所有角为圆角 20.0),),),);} }2. 使用 BorderRadius.only import package:flutter/material.dart; class OnlyBorderExample extends StatelessWidget {overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(Only Border Example)),body: Center(child: Container(width: 200,height: 200,decoration: BoxDecoration(color: Colors.green[100],borderRadius: BorderRadius.only(topLeft: Radius.circular(30.0),bottomRight: Radius.circular(30.0),),),),),);} } 3. 使用 BorderRadius.horizontal import package:flutter/material.dart; class HorizontalBorderExample extends StatelessWidget {overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(Horizontal Border Example)),body: Center(child: Container(width: 200,height: 200,decoration: BoxDecoration(color: Colors.red[100],borderRadius: BorderRadius.horizontal(left: Radius.circular(20.0),right: Radius.circular(50.0),),),),),);} } EditableText 在 Flutter 中EditableText 是文本输入框的核心控件所有类似 TextField 和 TextFormField 的控件都是基于 EditableText 封装的。EditableText 提供了更底层的能力允许开发者对文本输入框的行为进行高度自定义。 1. 什么是 EditableText EditableText 是一个可编辑的文本组件用于实现完全可控的文本输入功能。它不像 TextField 那样提供一套高阶封装而是提供了对文本输入的较底层控制包括 文本内容的管理 焦点的获取与丢失 自定义光标、样式、输入法行为 输入格式化器和验证规则 2. EditableText 的核心属性解析 以下是 EditableText 的关键属性及其作用 必需的属性 属性 类型 描述 controller TextEditingController 管理输入框内容的核心控制器可监听文本变化或更新文本。 focusNode FocusNode 管理输入框焦点状态的节点。可判断输入框是否聚焦并控制焦点行为。 style TextStyle 定义输入文本的样式如字体大小、文本颜色等。 cursorColor Color 设置光标的颜色。 backgroundCursorColor Color 光标的背景颜色当光标不可见时使用该颜色。 常用的属性 属性 类型 描述 obscureText bool 是否隐藏输入的文本常用于密码输入。 autofocus bool 是否在构建时自动获取焦点。 keyboardType TextInputType 设置键盘类型如文本、数字、email等。 textAlign TextAlign 文本的对齐方式如左对齐、右对齐、居中。 maxLines int 设置输入框的最大行数默认为 1。 minLines int 设置输入框的最小行数。 inputFormatters List 输入格式化器可用来限制或过滤非法输入如限制字数、屏蔽特殊字符等。 onChanged ValueChanged 当文本内容发生变化时触发的回调函数。 onEditingComplete VoidCallback 当用户完成编辑时如按下键盘的“完成”按钮触发的回调。 onSubmitted ValueChanged 用户提交输入内容时触发的回调。 readOnly bool 是否设置为只读模式用户无法编辑文本。 光标和样式相关属性 属性 类型 描述 cursorWidth double   光标的宽度。默认值通常为 2.0 像素。 cursorHeight double? 光标的高度。通常情况下光标的高度与文本的高度一致但你可以通过此属性自定义。 cursorRadius Radius? 光标的圆角半径。如果需要圆角光标可以在这里设置。 cursorOpacityAnimates bool 如果为 true光标的透明度会在显示和隐藏之间动画过渡。 selectionHeightStyle BoxHeightStyle 控制文本选择时的高度样式。影响文本选择的外观。 selectionWidthStyle BoxWidthStyle 控制文本选择时的宽度样式。通常与 selectionHeightStyle 一起使用。 其他重要属性 属性 类型 描述 toolbarOptions ToolbarOptions 定义当用户长按输入框时弹出工具栏中可用的选项如剪切、复制、粘贴等。 showCursor bool? 控制光标是否显示。 enableInteractiveSelection bool 控制是否允许用户交互式选择文本如长按选择文本。 textCapitalization TextCapitalization 控制输入文本的自动大写行为如每个单词首字母大写。 使用 EditableText 的示例 以下是一个使用 EditableText 的完整示例展示如何自定义一个简单的文本输入框 import package:flutter/material.dart;class EditableTextWidgetDemo extends StatefulWidget {const EditableTextWidgetDemo({super.key});override_EditableTextWidgetState createState() {return _EditableTextWidgetState();} }class _EditableTextWidgetState extends StateEditableTextWidgetDemo {final TextEditingController _controller TextEditingController();final FocusNode _focusNode FocusNode();overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(TextEditingController Example)),body: Center(child: Padding(padding: const EdgeInsets.all(16.0),child: EditableText(controller: _controller,focusNode: _focusNode,style: const TextStyle(color: Colors.black, fontSize: 18.0),cursorColor: Colors.blue,backgroundCursorColor: Colors.grey,keyboardType: TextInputType.text,autofocus: true,maxLines: null,// 允许多行输入onChanged: (text) {print(Text changed: $text);},),)));}overridevoid dispose() {_controller.dispose();_focusNode.dispose();super.dispose();} }总结 灵活性: EditableText 提供了高度的灵活性和定制能力。虽然 TextField 和 TextFormField 已经满足了大多数日常需求但 EditableText 允许开发者完全控制文本输入的细节。如果你需要实现一个非常定制化的文本输入体验EditableText 是一个很好的起点。 自定义控制: 通过 EditableText你可以完全自定义光标的外观、文本样式、输入格式化、焦点行为、输入法行为等等。这使得它适合于需要特定文本输入行为的应用场景。 底层实现: 作为 TextField 和 TextFormField 的底层实现EditableText 需要开发者手动管理 TextEditingController 和 FocusNode这意味着开发者必须更加关注资源的管理例如确保在不需要时正确释放这些对象。 应用场景: 使用 EditableText 适用于需要精细控制用户输入的场景比如自定义的文本编辑器、需要特殊输入验证的表单等。 通过了解和善用 EditableText开发者可以创建更具个性化的用户输入界面满足特定的应用需求。希望这个解析能够帮助你更好地理解和使用 EditableText。 GestureDetector GestureDetector 是 Flutter 中一个非常重要的组件用于检测用户的手势操作如点击、双击、拖动、滑动等。通过使用 GestureDetector你可以捕获用户在屏幕上的各种手势并对这些手势做出响应。这使得 GestureDetector 成为构建交互式用户界面的关键工具之一。 主要功能 GestureDetector 提供了一种简单而强大的方式来监听和响应用户的手势。以下是一些常用的手势检测功能 点击手势 onTap: 用户点击时触发。 onDoubleTap: 用户双击时触发。 onLongPress: 用户长按时触发。 拖动手势 onPanStart: 用户开始拖动时触发。 onPanUpdate: 用户拖动过程中触发。 onPanEnd: 用户拖动结束时触发。 滑动手势 onHorizontalDragStart, onHorizontalDragUpdate, onHorizontalDragEnd: 检测水平拖动。 onVerticalDragStart, onVerticalDragUpdate, onVerticalDragEnd: 检测垂直拖动。 缩放手势 onScaleStart, onScaleUpdate, onScaleEnd: 用于检测缩放操作通常用于实现捏合缩放功能。 基本用法 以下是一个简单的示例展示如何使用 GestureDetector 来监听不同的手势 import package:flutter/material.dart;class GestureDetectorExampleMyTestDemo extends StatelessWidget {const GestureDetectorExampleMyTestDemo({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(GestureDetector Example)),body: Center(child: GestureDetector(onTap: () {print(Tapped!);},onDoubleTap: () {print(Double Tapped!);},onLongPress: () {print(Long Pressed!);},onPanUpdate: (details) {print(Pan Updated: ${details.delta});},child: Container(width: 200,height: 200,color: Colors.blue,alignment: Alignment.center,child: const Text(Tap Me,style: TextStyle(color: Colors.white, fontSize: 24),),),),),);} }详细属性解析 onTap: 单次点击时的回调。 onDoubleTap: 双击时的回调。 onLongPress: 长按时的回调。 onPanStart, onPanUpdate, onPanEnd: 分别用于开始、更新和结束拖动时的回调。 onHorizontalDragStart, onHorizontalDragUpdate, onHorizontalDragEnd: 处理水平拖动。 onVerticalDragStart, onVerticalDragUpdate, onVerticalDragEnd: 处理垂直拖动。 onScaleStart, onScaleUpdate, onScaleEnd: 处理缩放手势。 注意事项 1. Hit Testing命中测试 GestureDetector 需要一个非空的子组件才能检测手势。 如果 GestureDetector 的子组件是空的比如没有子组件或者子组件是 Container 且未设置 color 属性手势检测将无法生效。这是因为 Flutter 默认不会为空组件进行命中测试。 解决方案可以为 GestureDetector 的子组件设置一个明确的背景颜色即使是透明的例如 color: Colors.transparent。 GestureDetector(onTap: () {print(Tapped);},child: Container(width: 100,height: 100,color: Colors.transparent, // 必须设置颜色否则点击事件可能无法检测), ) 2. 手势冲突 当多个手势识别器如拖动和缩放同时应用于同一个组件时可能会发生手势冲突。 Flutter 提供了 手势竞技场机制Gesture Arena 来解决冲突。在默认情况下多个手势识别器会竞争事件的优先权只有一个手势识别器会胜出。 如果你需要同时响应多个手势可以使用 RawGestureDetector 或 GestureRecognizer 来自定义手势行为。 例如通过 onScaleUpdate 实现拖动和缩放 GestureDetector(onScaleUpdate: (details) {print(Scale: ${details.scale}, Translation: ${details.focalPointDelta});},child: Container(width: 200,height: 200,color: Colors.blue,), ); 3. 嵌套手势 当 GestureDetector 嵌套时内部的手势可能会覆盖外部的手势或者导致手势冲突。 Flutter 提供了 Behavior 属性来控制手势的传播方式 HitTestBehavior.deferToChild默认值只有子组件能够响应手势时GestureDetector 才会检测手势。 HitTestBehavior.opaque即使子组件是透明的父组件也会参与命中测试。 HitTestBehavior.translucent父组件会响应手势但透明区域的子组件仍然可以响应手势。 GestureDetector(behavior: HitTestBehavior.translucent,onTap: () {print(Parent tapped!);},child: GestureDetector(onTap: () {print(Child tapped!);},child: Container(width: 100,height: 100,color: Colors.red,),), ); Flutter实现输入验证码代码学习 import dart:async;import package:flutter/material.dart; import package:flutter/services.dart;///验证码输入框 class VerificationCodeInputDemoPage extends StatelessWidget {const VerificationCodeInputDemoPage({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text(VerificationCodeInputDemoPage),),body: GestureDetector(behavior: HitTestBehavior.translucent,onTap: () {FocusScope.of(context).requestFocus(FocusNode());},child: Center(child: VerCodeInput(ctx: context,length: 6,keyboardType: TextInputType.number,builder: staticRectangle(context),onChanged: (value) {},///输入完成时onFilled: (value) {//print(Your input is $value.);},),),),);}staticRectangle(BuildContext context) {var codeSize 6;double padding 16;double width MediaQuery.sizeOf(context).width;double codeFullSize ((width - 2 * padding) / codeSize);double codeNormalSize codeFullSize - 20;return CodeInputBuilders.rectangle(totalSize: Size(codeFullSize, codeFullSize),emptySize: Size(codeNormalSize, codeNormalSize),filledSize: Size(codeNormalSize, codeNormalSize),borderRadius: BorderRadius.zero,border: Border.all(color: Theme.of(context).primaryColor, width: 1.0),color: Colors.transparent,textStyle: TextStyle(color: Theme.of(context).primaryColor,fontSize: 16.0,fontWeight: FontWeight.bold));} }///from https://github.com/tiny-express/flutter_verification_code_input/blob/master/lib/src/verification_code_input.darttypedef CodeInputBuilder Widget Function(bool hasFocus, String char);class VerCodeInput extends StatefulWidget {const VerCodeInput._({super.key,required this.length,required this.keyboardType,required this.inputFormatters,required this.builder,required this.ctx,this.onChanged,this.onFilled,});factory VerCodeInput({Key? key,required int length,TextInputType keyboardType TextInputType.text,ListTextInputFormatter? inputFormatters,BuildContext? ctx,required CodeInputBuilder builder,void Function(String value)? onChanged,void Function(String value)? onFilled,}) {assert(length 0, The length needs to be larger than zero.);assert(length.isFinite, The length needs to be finite.);inputFormatters ?? _createInputFormatters(length, keyboardType);return VerCodeInput._(key: key,length: length,keyboardType: keyboardType,inputFormatters: inputFormatters,builder: builder,ctx: ctx,onChanged: onChanged,onFilled: onFilled,);}/// The length of character entities to always display.////// ## Sample code////// A code input with 4 characters:////// dart/// CodeInput(length: 4)/// final int length;/// The type of thconstard which shows up.////// ## Sample codeconst////// dart/// CodeInput(keyboardType: TextInputType.number)/// final TextInputType keyboardType;/// A list of input formatters which can validate the text as it is being/// typed.////// If you specify this parameter, the default input formatters arent used,/// so make sure you really check for everything (like length of the input).////// ## Sample code////// An code input that displays a normal keyboard but only allows for/// hexadecimal input:////// dart/// CodeInput(/// inputFormatters: [/// WhitelistingTextInputFormatter(RegExp(^[0-9a-fA-F]*\$))/// ]/// )/// final ListTextInputFormatter inputFormatters;/// A builder for the character entities.////// See [CodeInputBuilders] for examples.final CodeInputBuilder builder;/// A callback for changes to the input.final void Function(String value)? onChanged;/// A callback for when the input is filled.final void Function(String value)? onFilled;/// context parent because of MediaQuery.of(widget.ctx)final BuildContext? ctx;/// A helping function that creates input formatters for a given length and/// keyboardType.static ListTextInputFormatter _createInputFormatters(int length, TextInputType keyboardType) {final formatters TextInputFormatter[LengthLimitingTextInputFormatter(length)];// Add keyboard specific formatters.// For example, a code input with a number keyboard type probably doesnt// want to allow decimal separators or signs.if (keyboardType TextInputType.number) {formatters.add(FilteringTextInputFormatter.digitsOnly);}return formatters;}override_VerCodeInputState createState() _VerCodeInputState(); }class _VerCodeInputState extends StateVerCodeInput {final node FocusNode();final controller TextEditingController();String get text controller.text;overrideWidget build(BuildContext context) {// Well display the visual widget and a not shown EditableText for doing// the actual work on top of each other.return Stack(children: Widget[// This is the actual EditableText wrapped in a Container with zero// dimensions.SizedBox(width: 0.0,height: 0.0,child: EditableText(controller: controller,focusNode: node,inputFormatters: widget.inputFormatters,keyboardType: widget.keyboardType,backgroundCursorColor: Colors.black,style: const TextStyle(),// Doesnt really matter.cursorColor: Colors.black,// Doesnt really matter.onChanged: (value) setState(() {widget.onChanged?.call(value);if (value.length widget.length) {widget.onFilled?.call(value);}}),)),// These are the actual character widgets. A transparent container lies// right below the gesture detector, so all taps get collected, even// the ones between the character entities.GestureDetector(onTap: () {if (MediaQuery.viewInsetsOf(context).bottom 0) {final focusScope FocusScope.of(context);focusScope.requestFocus(FocusNode());Future.delayed(Duration.zero, () focusScope.requestFocus(node));}},child: Container(color: Colors.transparent,child: Row(mainAxisSize: MainAxisSize.min,children: List.generate(widget.length, (i) {final hasFocus controller.selection.start i;final char i text.length ? text[i] : ;final characterEntity widget.builder(hasFocus, char);return characterEntity;}),),)),]);} }/// An abstract class that provides some commonly-used builders for the /// character entities. /// /// * [containerized]: A builder putting chars in an animated container. /// * [circle]: A builder putting chars in circles. /// * [rectangle]: A builder putting chars in rectangles. /// * [lightCircle]: A builder putting chars in light circles. /// * [darkCircle]: A builder putting chars in dark circles. /// * [lightRectangle]: A builder putting chars in light rectangles. /// * [darkRectangle]: A builder putting chars in dark rectangles. abstract class CodeInputBuilders {/// Builds the input inside an animated container.static CodeInputBuilder containerized({Duration animationDuration const Duration(milliseconds: 50),required Size totalSize,required Size emptySize,required Size filledSize,required BoxDecoration emptyDecoration,required BoxDecoration filledDecoration,required TextStyle emptyTextStyle,required TextStyle filledTextStyle,}) {return (bool hasFocus, String char) Container(width: totalSize.width,height: totalSize.height,alignment: Alignment.center,child: AnimatedContainer(duration: const Duration(milliseconds: 100),decoration: char.isEmpty ? emptyDecoration : filledDecoration,width: char.isEmpty ? emptySize.width : filledSize.width,height: char.isEmpty ? emptySize.height : filledSize.height,alignment: Alignment.center,child: Text(char,style: char.isEmpty ? emptyTextStyle : filledTextStyle),));}/// Builds the input inside a circle.static CodeInputBuilder circle({double totalRadius 30.0,double emptyRadius 10.0,double filledRadius 25.0,required Border border,required Color color,required TextStyle textStyle}) {final decoration BoxDecoration(shape: BoxShape.circle,border: border,color: color,);return containerized(totalSize: Size.fromRadius(totalRadius),emptySize: Size.fromRadius(emptyRadius),filledSize: Size.fromRadius(filledRadius),emptyDecoration: decoration,filledDecoration: decoration,emptyTextStyle: textStyle.copyWith(fontSize: 0.0),filledTextStyle: textStyle);}/// Builds the input inside a rectangle.static CodeInputBuilder rectangle({Size totalSize const Size(50.0, 60.0),Size emptySize const Size(20.0, 20.0),Size filledSize const Size(40.0, 60.0),BorderRadius borderRadius BorderRadius.zero,required Border border,required Color color,required TextStyle textStyle,}) {final decoration BoxDecoration(border: border,borderRadius: borderRadius,color: color,);return containerized(totalSize: totalSize,emptySize: emptySize,filledSize: filledSize,emptyDecoration: decoration,filledDecoration: decoration,emptyTextStyle: textStyle.copyWith(fontSize: 0.0),filledTextStyle: textStyle);}/// Builds the input inside a light circle.static CodeInputBuilder lightCircle({double totalRadius 30.0,double emptyRadius 10.0,double filledRadius 25.0,}) {return circle(totalRadius: totalRadius,emptyRadius: emptyRadius,filledRadius: filledRadius,border: Border.all(color: Colors.white, width: 2.0),color: Colors.white10,textStyle: const TextStyle(color: Colors.white, fontSize: 20.0, fontWeight: FontWeight.bold));}/// Builds the input inside a light circle.static CodeInputBuilder darkCircle({double totalRadius 30.0,double emptyRadius 10.0,double filledRadius 25.0,}) {return circle(totalRadius: totalRadius,emptyRadius: emptyRadius,filledRadius: filledRadius,border: Border.all(color: Colors.black, width: 2.0),color: Colors.black12,textStyle: const TextStyle(color: Colors.black, fontSize: 20.0, fontWeight: FontWeight.bold));}/// Builds the input inside a light rectangle.static CodeInputBuilder lightRectangle({Size totalSize const Size(50.0, 60.0),Size emptySize const Size(20.0, 20.0),Size filledSize const Size(40.0, 60.0),BorderRadius borderRadius BorderRadius.zero,}) {return rectangle(totalSize: totalSize,emptySize: emptySize,filledSize: filledSize,borderRadius: borderRadius,border: Border.all(color: Colors.white, width: 2.0),color: Colors.white10,textStyle: const TextStyle(color: Colors.white, fontSize: 20.0, fontWeight: FontWeight.bold));}static CodeInputBuilder staticRectangle({Size totalSize const Size(60.0, 60.0),Size emptySize const Size(40.0, 40.0),Size filledSize const Size(40.0, 40.0),BorderRadius borderRadius BorderRadius.zero,}) {return rectangle(totalSize: totalSize,emptySize: emptySize,filledSize: filledSize,borderRadius: borderRadius,border: Border.all(color: Colors.white, width: 1.0),color: Colors.transparent,textStyle: const TextStyle(color: Colors.white, fontSize: 20.0, fontWeight: FontWeight.bold));}/// Builds the input inside a dark rectangle.static CodeInputBuilder darkRectangle({Size totalSize const Size(50.0, 60.0),Size emptySize const Size(20.0, 20.0),Size filledSize const Size(40.0, 60.0),BorderRadius borderRadius BorderRadius.zero,}) {return rectangle(totalSize: totalSize,emptySize: emptySize,filledSize: filledSize,borderRadius: borderRadius,border: Border.all(color: Colors.black, width: 2.0),color: Colors.black12,textStyle: const TextStyle(color: Colors.black, fontSize: 20.0, fontWeight: FontWeight.bold));} }
http://www.pierceye.com/news/502577/

相关文章:

  • 惠州网站公司网站制作成app
  • 站群管理系统汕头网站建设和运营
  • 泉州哪里做网站开发攻击asp网站
  • 网站参考模板网络营销案例论文3000字
  • 网站开发 盈利采购网站模板
  • 营销网站建设的规则徐州经济开发区网站
  • 做动图的网站知乎wordpress 死链提交
  • 无锡网站维护公司安卓手机优化软件排名
  • 怎么查一个网站做的外链浏览器网站免费进入
  • 济南网站建设小程序必要网站用什么做的
  • 京东商城网站怎么做wordpress幻灯
  • 建设银行明细网站能查多久企业取名
  • 总行网站建设银行报培训机构是干什么的
  • 企业网站推广建议淳安千岛湖建设集团网站
  • 网站建设代码优化石家庄门户网站制作
  • 网站可以制作ios网站源码提取
  • 建设银行网站怎么开通手机通知做网站回答
  • 网页制作的价格大概三河网站seo
  • 东莞网站建设 信科网络wordpress图片域名
  • 软件行业 网站建设 模块吉林电商的网络推广
  • 自己有服务器和域名怎么做网站门户网站建设推荐
  • 兰州新站点seo代理吉林市网站建设招标
  • 网站开发形式选择wordpress tag__not_in
  • 中国建设银行官网登录入口手机版长沙seo外包平台
  • 网站开发过程分为哪几个阶段电子商务网站建设毕业设计
  • 网站建设管理风险点广州网站设计智能 乐云践新专家
  • 阿里云增加网站wordpress前台后台都空白
  • 做网站商城要注册什么公司建行官网官网网站吗
  • 国外做meta分析的网站wordpress 下载文件插件
  • 济南城市建设集团网站陕西网