Flutter富文本编辑器插件enough_html_editor的使用
Flutter富文本编辑器插件enough_html_editor的使用
Slim HTML编辑器用于Flutter,具有完整的API控制和可选的基于Flutter的小部件控件。
API文档
请参阅完整的API文档:https://pub.dev/documentation/enough_html_editor/latest/
使用
当前enough_html_editor
包包含以下小部件:
HtmlEditor
:HTML编辑器。HtmlEditorControls
:可选的编辑器控件。SliverHeaderHtmlEditorControls
:包装器,用于在CustomScrollView
中作为粘性头部使用。HtmlEditorApi
:非小部件 - 用于控制编辑器的API,使用API可以访问编辑后的HTML文本或设置当前文本为粗体,添加无序列表等。PackagedHtmlEditor
:一个简单的Widget,包含HtmlEditor
和HtmlEditorControls
。
访问API
你可以选择两种方式之一来访问API:
选项1:使用onCreated(HtmlEditorApi)
回调
HtmlEditor(
onCreated: (api) {
setState(() {
_editorApi = api;
});
},
...
);
之后可以直接访问API,例如:
final text = await _editorApi.getText();
选项2:定义并分配一个GlobalKey<HtmlEditorState>
final _keyEditor = GlobalKey<HtmlEditorState>();
Widget build(BuildContext context) {
return HtmlEditor(
key: _keyEditor,
...
);
}
可以通过这个GlobalKey
访问HtmlEditorState
:
final text = await _keyEditor.currentState.api.getText();
无论是API还是全局键都是创建HtmlEditorControls
所必需的。
快速开始
使用PackagedHtmlEditor
进行快速启动。这包含默认的控件和编辑器。
import 'package:enough_html_editor/enough_html_editor.dart';
[...]
HtmlEditorApi _editorApi;
[@override](/user/override)
Widget build(BuildContext context) {
return PackagedHtmlEditor(
onCreated: (api) {
_editorApi = api;
},
initialContent: '''
<p>这里是一些文本</p>
<p>这里是一些<b>加粗</b>文本</p>
<p>这里是一些<i>斜体</i>文本</p>
<p>这里是一些<i><b>加粗和斜体</b></i>文本</p>
<p style="text-align: center;">这里是一些<u><i><b>加粗、斜体和下划线</b></i></u>文本</p>
<ul><li>一个列表元素</li><li>另一个点</li></ul>
<blockquote>这里是一个引用<br/>
横跨几行<br/>
<blockquote>
另一个第二级引用
</blockquote>
</blockquote>
''',
);
}
使用你在onCreated
回调中接收的HtmlEditorApi
查询最终文本:
// 获取仅编辑的文本作为HTML代码:
final text = await _editorApi.getText();
// 获取完整的HTML文档:
final fullHtml = await _editorApi.getFullHtml();
安装
将此依赖项添加到你的pubspec.yaml
文件中:
dependencies:
enough_html_editor: ^0.0.4
enough_html_editor
的最新版本是:
特性和错误报告
请在问题跟踪器上提交功能请求和错误。
许可证
此软件受商业友好的Mozilla公共许可证2.0版许可。
以下是完整的示例代码:
import 'package:enough_html_editor/enough_html_editor.dart';
import 'package:enough_platform_widgets/enough_platform_widgets.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() {
runApp(MyApp());
}
const _htmlContent =
'''<p>这里是一些文本</p> 带有一个 <a href="https://github.com/Enough-Software/enough_html_editor">链接</a>。
<p>这里是一些<b>加粗</b>文本</p>
<p>这里是一些<i>斜体</i>文本</p>
<p>这里是一些<i><b>加粗和斜体</b></i>文本</p>
<p style="text-align: center;">这里是一些<u><i><b>加粗、斜体和下划线</b></i></u>文本</p>
<ul><li>一个列表元素</li><li>另一个点</li></ul>
<blockquote>这里是一个引用<br/>
横跨几行<br/>
<blockquote>
另一个第二级引用
</blockquote>
</blockquote>
''';
/// 示例应用程序,展示如何使用enough_html_editor包
class MyApp extends StatelessWidget {
// 这个小部件是你的应用的根
[@override](/user/override)
Widget build(BuildContext context) => PlatformSnackApp(
title: 'enough_html_editor Demo',
materialTheme: ThemeData(
primarySwatch: Colors.green,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
cupertinoTheme: const CupertinoThemeData(
primaryColor: CupertinoColors.activeGreen,
brightness: Brightness.light,
),
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('en'),
],
home: const EditorPage(),
);
}
/// 示例如何使用简化版的[PackagedHtmlEditor]
/// 它结合了默认控件和编辑器
class EditorPage extends StatefulWidget {
/// 创建一个新的编辑器页面
const EditorPage({Key? key}) : super(key: key);
[@override](/user/override)
_EditorPageState createState() => _EditorPageState();
}
class _EditorPageState extends State<EditorPage> {
HtmlEditorApi? _editorApi;
[@override](/user/override)
Widget build(BuildContext context) => PlatformScaffold(
appBar: PlatformAppBar(
title: const Text('PackagedHtmlEditor'),
trailingActions: [
DensePlatformIconButton(
icon: const Icon(Icons.send),
onPressed: () async {
final text = await _editorApi!.getText();
print('获取到的文本: [$text]');
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ResultScreen(htmlText: text),
),
);
},
),
DensePlatformIconButton(
icon: const Icon(Icons.looks_two),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const CustomScrollEditorPage(),
),
);
},
),
],
),
body: SingleChildScrollView(
child: SafeArea(
child: Column(
children: [
PlatformTextButton(
onPressed: () => _editorApi?.unfocus(context),
child: const Text('取消焦点'),
),
PackagedHtmlEditor(
onCreated: (api) {
_editorApi = api;
},
initialContent: _htmlContent,
),
],
),
),
),
);
}
/// 示例如何在CustomScrollView中使用编辑器
class CustomScrollEditorPage extends StatefulWidget {
/// 创建一个自定义滚动视图示例页面
const CustomScrollEditorPage({Key? key}) : super(key: key);
[@override](/user/override)
_CustomScrollEditorPageState createState() => _CustomScrollEditorPageState();
}
class _CustomScrollEditorPageState extends State<CustomScrollEditorPage> {
HtmlEditorApi? _editorApi;
[@override](/user/override)
Widget build(BuildContext context) => PlatformScaffold(
body: CustomScrollView(
physics: const BouncingScrollPhysics(),
slivers: [
PlatformSliverAppBar(
title: const Text('粘性控件'),
floating: false,
pinned: true,
stretch: true,
actions: [
DensePlatformIconButton(
icon: const Icon(Icons.send),
onPressed: () async {
final text = await _editorApi!.getText();
print('获取到的文本: [$text]');
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ResultScreen(htmlText: text),
),
);
},
),
DensePlatformIconButton(
icon: const Icon(Icons.looks_one),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const EditorPage(),
),
);
},
),
],
),
const SliverToBoxAdapter(
child: Padding(
padding: EdgeInsets.all(8.0),
child: DecoratedPlatformTextField(
decoration: InputDecoration(hintText: '主题')),
),
),
if (_editorApi != null) ...{
SliverHeaderHtmlEditorControls(editorApi: _editorApi),
},
SliverToBoxAdapter(
child: HtmlEditor(
onCreated: (api) {
setState(() {
_editorApi = api;
});
},
initialContent: _htmlContent,
),
),
],
),
);
}
/// 显示结果HTML代码
class ResultScreen extends StatelessWidget {
/// 创建一个新的结果屏幕
const ResultScreen({Key? key, required this.htmlText}) : super(key: key);
/// HTML代码
final String htmlText;
[@override](/user/override)
Widget build(BuildContext context) => PlatformScaffold(
appBar: PlatformAppBar(
title: const Text('结果'),
),
body: SingleChildScrollView(
child: SafeArea(child: SelectableText(htmlText)),
),
);
}
更多关于Flutter富文本编辑器插件enough_html_editor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter富文本编辑器插件enough_html_editor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用enough_html_editor
插件的示例代码。这个插件提供了一个富文本编辑器,可以方便地集成到你的应用中。
首先,确保你已经在pubspec.yaml
文件中添加了enough_html_editor
依赖:
dependencies:
flutter:
sdk: flutter
enough_html_editor: ^最新版本号 # 请替换为实际最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中按照以下步骤使用enough_html_editor
。
示例代码
- 导入必要的包
import 'package:flutter/material.dart';
import 'package:enough_html_editor/enough_html_editor.dart';
- 创建编辑器页面
class EditorPage extends StatefulWidget {
@override
_EditorPageState createState() => _EditorPageState();
}
class _EditorPageState extends State<EditorPage> {
late EnoughHtmlController controller;
@override
void initState() {
super.initState();
controller = EnoughHtmlController(
initialHtml: '<p>Hello, <b>World</b>!</p>', // 初始HTML内容
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter 富文本编辑器'),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Expanded(
child: EnoughHtmlEditor(
controller: controller,
// 自定义工具栏项,如果需要
toolbarOptions: [
ToolbarOptions.heading,
ToolbarOptions.bold,
ToolbarOptions.italic,
ToolbarOptions.underline,
ToolbarOptions.strikeThrough,
ToolbarOptions.link,
ToolbarOptions.image,
ToolbarOptions.quote,
ToolbarOptions.code,
ToolbarOptions.undo,
ToolbarOptions.redo,
],
// 自定义样式
editorStyle: TextStyle(fontSize: 16),
// 自定义图片上传回调
onImageUpload: (file) async {
// 这里可以添加你的图片上传逻辑
// 例如上传到服务器并返回URL
String imageUrl = 'https://example.com/your-uploaded-image.jpg';
controller.insertHtml('<img src="$imageUrl" alt="Uploaded Image" />');
},
),
),
ElevatedButton(
onPressed: () {
// 获取HTML内容
String htmlContent = controller.html;
// 这里可以处理获取到的HTML内容,例如保存到数据库或显示到另一个页面
print(htmlContent);
},
child: Text('获取HTML内容'),
),
],
),
),
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
}
- 在你的应用中导航到编辑器页面
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => EditorPage()),
);
},
child: Text('打开富文本编辑器'),
),
),
),
);
}
}
运行项目
确保你已经正确配置了Flutter开发环境,然后运行flutter run
来启动你的应用。你应该会看到一个按钮,点击后会导航到富文本编辑器页面,你可以在那里编辑文本并查看HTML内容。
这个示例展示了如何使用enough_html_editor
插件来创建一个基本的富文本编辑器,并获取用户编辑后的HTML内容。你可以根据实际需求进一步自定义和扩展这个编辑器。