Flutter自定义输入字段插件creamy_field的使用

Flutter 自定义输入字段插件 creamy_field 的使用

creamy_field 插件提供了丰富的文本组件、自定义选择工具栏和语法高亮支持,适用于富文本编辑器。以下是该插件的使用指南。

获取开始

该插件的主要组件

  1. CreamyEditingController
  2. Syntax Highlighter
  3. LineCountIndicator
  4. HorizontalScrollable
  5. 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

1 回复

更多关于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'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部