Flutter自定义输入字段插件creamy_field的使用
Flutter 自定义输入字段插件 creamy_field 的使用
creamy_field
插件提供了丰富的文本组件、自定义选择工具栏和语法高亮支持,适用于富文本编辑器。以下是该插件的使用指南。
获取开始
该插件的主要组件
CreamyEditingController
Syntax Highlighter
LineCountIndicator
HorizontalScrollable
CreamyTextSelectionControlsProvider
creamy_field
包使用了一些来自 Flutter 的代码以保持与 Flutter 其他组件的 API 相似/兼容。
CreamyEditingController
CreamyEditingController
负责改变制表符大小,应用语法高亮到文本,并提供其他有用的信息如行数。
你可以将 CreamyEditingController
用作 Flutter 中的 TextEditingController
。语法高亮功能也会在这些文本框中工作。
Syntax Highlighter
你可以使用 CreamySyntaxHighlighter
来实现对多种编程语言和主题的有限语法高亮支持。
由于文本字段本身独立于语法高亮规则,你需要为你的自定义语法单独实现语法高亮,并将其提供给控制器。
LineCountIndicator
LineCountIndicator
是一个水平小部件,用于表示相邻文本字段的行号列表。
你可以通过 [LineCountIndicatorDecoration]
装饰来应用装饰到此小部件。
确保装饰使用与文本字段相同的字体家族和字体大小。
HorizontalScrollable
HorizontalScrollable
使子小部件可以水平滚动。它旨在包裹一个 TextField
使其可水平滚动。
未来,该小部件中的控制器将被用来确定水平滚动范围。
CreamyTextSelectionControlsProvider
这个类可用于向文本字段的选择工具栏添加额外的工具栏操作。
该包通过 CreamyTextSelectionControls
提供了几个文本选择控件(v0.4.0 版本仅提供了一个)。你可以通过混合 [CreamyTextSelectionControls]
并在 [CreamyTextSelectionControlsProvider.custom]
中提供它们来创建支持额外工具栏操作的自定义选择控件。
注意事项
- 版本 之前 v0.4.0 与 flutter v2.x.x 不兼容,因为文本编辑 API 引入了许多破坏性的更改。我们将在 v0.4.0 及以上版本中尝试保持 API 稳定。
- 如果你使用的是 flutter SDK
>=1.22.0 <2.0.0
,请使用creamy_field v0.3.3
。 - 如果你使用的是 flutter SDK
>1.20.0 <1.22.0
,请使用creamy_field v0.3.2
。 - 如果你使用的是 flutter SDK
<=1.20.0
,请使用creamy_field v0.3.1
。
请查看 截图文件夹 以获取一些示例 UI 截图。
完整示例代码
import 'package:flutter/material.dart';
import 'package:creamy_field/creamy_field.dart'; // 导入插件
void main() {
final ThemeData _theme = ThemeData(primarySwatch: Colors.blue);
runApp(MaterialApp(
home: MyEditorApp(),
// 切换主题模式以尝试在暗模式和亮模式下的语法高亮颜色
themeMode: ThemeMode.light,
theme: ThemeData(primarySwatch: Colors.blue),
darkTheme: _theme.copyWith(brightness: Brightness.dark),
));
}
class MyEditorApp extends StatefulWidget {
[@override](/user/override)
_MyEditorAppState createState() => _MyEditorAppState();
}
class _MyEditorAppState extends State<MyEditorApp> {
// 声明一个常规语法控制器。
late CreamyEditingController controller;
late ScrollController scrollController;
[@override](/user/override)
void initState() {
super.initState();
// 下面的例子展示了 [CreamyEditingController],一个具有富文本高亮支持的文本编辑控制器
controller = CreamyEditingController(
// 这是控制器将使用的语法高亮器
syntaxHighlighter: CreamySyntaxHighlighter(
language: LanguageType.dart,
theme: HighlightedThemeType.defaultTheme,
),
// 将替换 `\t` 的空格数量
// 设置为 1 没有任何效果,设置为小于 1 的值会抛出断言错误。
tabSize: 4,
);
scrollController = ScrollController();
}
[@override](/user/override)
void dispose() {
controller.dispose();
scrollController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
bool _isDark = Theme.of(context).brightness == Brightness.dark;
return new Scaffold(
backgroundColor: _isDark ? Colors.black : Colors.white,
appBar: new AppBar(
title: new Text("富代码编辑器"),
actions: [
TextButton(
child: Text('添加制表符'),
onPressed: () {
// 在选择的基偏移处添加一个制表符
controller.addTab();
},
)
],
),
// 显示行指示列
body: LineCountIndicator(
textControllerOfTextField: controller,
scrollControllerOfTextField: scrollController,
decoration: LineCountIndicatorDecoration(
backgroundColor: Colors.grey,
),
// 允许此文本字段水平滚动
child: HorizontalScrollable(
// 文本选择小部件的附加选项
child: TextField(
autofocus: true,
// 控制器应该被提升为 CreamyEditingController
// 注意:如果失败,请声明控制器为 CreamyEditingController
controller: controller,
scrollController: scrollController,
textCapitalization: TextCapitalization.none,
decoration: InputDecoration.collapsed(hintText: '开始编写'),
maxLines: null,
selectionControls: CreamyTextSelectionControlsProvider(
type: TextSelectionControlsType.material,
actionsBuilder: (_, __, ___) {
return [
CreamyTextSelectionToolbarAction(
label: '按钮1',
onPressed: () {
print('按钮1');
},
),
CreamyTextSelectionToolbarAction(
label: '按钮2',
onPressed: () {
print('按钮2');
},
),
];
},
),
),
),
),
);
}
}
更多关于Flutter自定义输入字段插件creamy_field的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter自定义输入字段插件creamy_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
creamy_field
是一个用于 Flutter 的自定义输入字段插件,它提供了丰富的功能和定制选项,使开发者能够轻松地创建美观且功能强大的输入字段。以下是如何使用 creamy_field
插件的详细指南。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 creamy_field
插件的依赖:
dependencies:
flutter:
sdk: flutter
creamy_field: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 基本使用
creamy_field
提供了一个 CreamyField
组件,你可以像使用 TextField
一样使用它。
import 'package:flutter/material.dart';
import 'package:creamy_field/creamy_field.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('CreamyField Example')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: CreamyField(
decoration: CreamyDecoration(
labelText: 'Enter your text',
hintText: 'Type something...',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
),
),
),
);
}
}
3. 自定义装饰
CreamyField
提供了丰富的装饰选项,你可以通过 CreamyDecoration
来自定义输入字段的外观。
CreamyField(
decoration: CreamyDecoration(
labelText: 'Username',
hintText: 'Enter your username',
prefixIcon: Icon(Icons.person),
suffixIcon: Icon(Icons.clear),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide(color: Colors.blue),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide(color: Colors.green),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide(color: Colors.red),
),
),
)
4. 输入验证
你可以通过 validator
属性来添加输入验证逻辑。
CreamyField(
decoration: CreamyDecoration(
labelText: 'Email',
hintText: 'Enter your email',
),
validator: (value) {
if (value.isEmpty) {
return 'Please enter your email';
}
if (!value.contains('@')) {
return 'Please enter a valid email';
}
return null;
},
)
5. 控制输入行为
你可以通过 controller
属性来控制输入字段的行为。
final _controller = CreamyController();
[@override](/user/override)
Widget build(BuildContext context) {
return CreamyField(
controller: _controller,
decoration: CreamyDecoration(
labelText: 'Password',
hintText: 'Enter your password',
),
);
}
6. 其他功能
creamy_field
还提供了其他一些功能,例如:
- 自动完成:通过
autocomplete
属性启用自动完成功能。 - 密码字段:通过
obscureText
属性将输入字段设置为密码字段。 - 多行输入:通过
maxLines
属性支持多行输入。
CreamyField(
decoration: CreamyDecoration(
labelText: 'Password',
hintText: 'Enter your password',
),
obscureText: true,
)
7. 完整示例
以下是一个完整的示例,展示了如何使用 creamy_field
插件创建一个带有验证和自定义装饰的输入字段。
import 'package:flutter/material.dart';
import 'package:creamy_field/creamy_field.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('CreamyField Example')),
body: MyForm(),
),
);
}
}
class MyForm extends StatefulWidget {
[@override](/user/override)
_MyFormState createState() => _MyFormState();
}
class _MyFormState extends State<MyForm> {
final _formKey = GlobalKey<FormState>();
final _emailController = CreamyController();
[@override](/user/override)
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
children: [
CreamyField(
controller: _emailController,
decoration: CreamyDecoration(
labelText: 'Email',
hintText: 'Enter your email',
prefixIcon: Icon(Icons.email),
),
validator: (value) {
if (value.isEmpty) {
return 'Please enter your email';
}
if (!value.contains('@')) {
return 'Please enter a valid email';
}
return null;
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
if (_formKey.currentState.validate()) {
// 表单验证通过
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Form Submitted Successfully')),
);
}
},
child: Text('Submit'),
),
],
),
),
);
}
}