Flutter Markdown渲染插件markdown_browser的使用
Flutter Markdown渲染插件markdown_browser的使用
本包用于简化浏览Markdown文件的过程。
该包在应用程序需要提供一套作为帮助内容或用户手册的Markdown文件,并且需要一个浏览器小部件在Flutter应用程序中显示时非常有用。
Markdown文件可以放在资源文件夹中,也可以从外部服务器获取。
截图
(由于没有提供截图,此处不显示)
特性
- 在同一文件夹/相同基URL下的Markdown文件之间浏览。
- 打开其他链接时在webview中打开。
- 支持头部浏览和历史记录。
- 支持Latex方程式(使用 $…$ 和 $$…$$)。
- 提供基本的导航菜单,阅读文档时自动隐藏。
- 作为一个小部件提供,因此可以嵌入到任何其他小部件中。它不必是一个独立页面。
为了渲染Markdown文件,使用了markdown_widget包。有关支持的功能和限制,请参阅markdown_widget演示。
开始使用
添加包到你的pubspec.yaml
文件
flutter pub add markdown_browser
添加riverpod
此包使用Riverpod来管理状态。
flutter pub add flutter_riverpod
如Riverpod所要求的,将整个应用程序包裹在一个ProviderScope
小部件中。
void main() {
runApp(
ProviderScope(
child: MyApp(),
),
);
}
调用小部件
import 'package:markdown_browser/markdown_browser.dart';
使用小部件:
MarkdownBrowser(
urlBase: "http://127.0.0.1:5000",
onExitCB: () {
// 你的逻辑以移除Markdown浏览器
},
landingPage: "my_indexPage.md", // 默认为index.md
onGetMarkDownCB: (String path) async {
final String content = // 你的逻辑以下载/加载文件
return content;
}, // 默认为基于内部HTTP的逻辑
)
使用说明
参考提供的示例,了解如何使用此包处理离线和在线内容。
离线
将包含Markdown文件的文件夹存储在assets中,并将其添加到<Application>/pubspec.yaml
文件中。不要忘记添加内容中的子文件夹。
flutter:
assets:
- assets/user_manual_1/
- assets/user_manual_1/topic/
调用小部件并设置urlBase
为assets/user_manual_1
。
在线
确保链接<urlBase>/<landingPage>
有效。
要测试此包的在线功能,在example/server文件夹下提供了一个测试服务器。确保已安装python3、python3-pip和python3-venv并运行提供的脚本。
在Linux机器上,可以这样做:
sudo apt install python3 python3-pip python3-venv -y
cd example/server
bash start_server.sh
这将启动Flask服务器并在本地和网络地址上提供服务。
* Serving Flask app 'server.py'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://x.x.x.x:5000
如果在同一台机器上进行测试,则无需更改即可使用http://127.0.0.1:5000
的在线版本。
如果在移动设备或另一台机器上进行测试,请确保通过将BaseURL修改为http://x.x.x.x:5000
后运行Flutter应用,使服务器在本地网络上提供服务。
额外信息
计划增强
- ❌ 如果在浏览过程中页面失败,提供返回上一个文件的按钮。
- ❌ 暴露更多由markdown_widget允许的应用程序定制。
- ❌ 测试更多的Markdown内容。
已知问题
- ❌ 无法导航到同一Markdown文件中的特定部分或另一个文件中的特定部分。这似乎不受markdown_widget包的支持。
支持
如果您遇到任何问题或有任何增强建议,请在GitHub上创建问题,或联系cloudonlanapps (at) gmail (dot) com。
您还可以发送您的pull请求,如果您想要贡献。
示例代码
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:markdown_browser/markdown_browser.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
void main() {
runApp(
const ProviderScope(
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({
super.key,
});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Markdown Browser Demo',
initialRoute: '/',
home: const MainPage(),
routes: {
MainPage.routeName: (context) {
return const MainPage();
},
MarkdownBrowserPage.routeName: (context) {
return const MarkdownBrowserPage();
},
},
debugShowCheckedModeBanner: false,
);
}
}
class MainPage extends StatelessWidget {
const MainPage({super.key});
static const String routeName = '/main_page';
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Markdown Browser Demo"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
OpenManual(
urlBase: "assets/user_manual_1",
label: "Open Offline Manual",
icon: Icon(MdiIcons.cellphoneLink),
),
const SizedBox(
height: 16,
),
OpenManual(
urlBase: "http://127.0.0.1:5000",
label: "Open Online Manual",
icon: Icon(MdiIcons.cellphoneLink),
),
],
),
),
);
}
}
class OpenManual extends StatelessWidget {
const OpenManual(
{super.key,
required this.urlBase,
required this.label,
required this.icon});
final String urlBase;
final String label;
final Icon icon;
[@override](/user/override)
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton.icon(
onPressed: () => Navigator.pushNamed(
context,
MarkdownBrowserPage.routeName,
arguments: {"urlBase": urlBase},
),
icon: icon,
label: Text(label,
style: Theme.of(context).textTheme.bodyLarge!,
textAlign: TextAlign.center)),
);
}
}
class MarkdownBrowserPage extends StatelessWidget {
const MarkdownBrowserPage({super.key, this.arguments});
final Map<String, String>? arguments;
static const String routeName = '/markdown_browser_page';
[@override](/user/override)
Widget build(BuildContext context) {
final args =
ModalRoute.of(context)!.settings.arguments as Map<String, String>;
if (args.containsKey("urlBase") && args["urlBase"] != null && args["urlBase"]!.isNotEmpty) {
return Scaffold(
body: MarkdownBrowser(
urlBase: args["urlBase"]!,
onExitCB: () {
if (Navigator.canPop(context)) {
Navigator.pop(context);
}
}),
);
} else {
return const Scaffold(
body: Center(
child: Text("urlBase is not provided"),
),
);
}
}
}
更多关于Flutter Markdown渲染插件markdown_browser的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Markdown渲染插件markdown_browser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
markdown_browser
是一个用于在 Flutter 应用中渲染 Markdown 内容的插件。它允许你轻松地将 Markdown 文本转换为 Flutter 的 Widget,以便在应用中进行展示。以下是如何使用 markdown_browser
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 markdown_browser
依赖:
dependencies:
flutter:
sdk: flutter
markdown_browser: ^0.0.1 # 请检查最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入包
在你的 Dart 文件中导入 markdown_browser
包:
import 'package:markdown_browser/markdown_browser.dart';
3. 使用 MarkdownBrowser Widget
MarkdownBrowser
是一个可以直接使用的 Widget,它接受一个 String
类型的 Markdown 文本并渲染它。
class MyMarkdownPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
String markdownText = """
# 标题 1
## 标题 2
### 标题 3
这是一个段落。
- 列表项 1
- 列表项 2
- 列表项 3
**加粗文本**
*斜体文本*
[链接](https://flutter.dev)
""";
return Scaffold(
appBar: AppBar(
title: Text('Markdown 渲染示例'),
),
body: MarkdownBrowser(
data: markdownText,
),
);
}
}
4. 运行应用
现在你可以运行你的 Flutter 应用,并看到 Markdown 内容被渲染为 Flutter Widget。
5. 自定义样式(可选)
MarkdownBrowser
允许你自定义 Markdown 渲染的样式。你可以通过 style
参数来传递自定义的样式:
MarkdownBrowser(
data: markdownText,
style: MarkdownStyle(
h1: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
h2: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
p: TextStyle(fontSize: 16),
// 其他样式
),
);
6. 处理链接(可选)
默认情况下,MarkdownBrowser
会处理 Markdown 中的链接。你可以通过 onTapLink
回调来自定义链接点击行为:
MarkdownBrowser(
data: markdownText,
onTapLink: (String url) {
print('点击链接: $url');
// 你可以在这里处理链接点击,比如打开浏览器
},
);
7. 其他功能
markdown_browser
还支持其他功能,例如表格、代码块、图片等。你可以根据需要进一步探索和使用这些功能。
完整示例
以下是一个完整的示例,展示了如何在 Flutter 应用中使用 markdown_browser
渲染 Markdown 内容:
import 'package:flutter/material.dart';
import 'package:markdown_browser/markdown_browser.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: MyMarkdownPage(),
);
}
}
class MyMarkdownPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
String markdownText = """
# 标题 1
## 标题 2
### 标题 3
这是一个段落。
- 列表项 1
- 列表项 2
- 列表项 3
**加粗文本**
*斜体文本*
[链接](https://flutter.dev)
""";
return Scaffold(
appBar: AppBar(
title: Text('Markdown 渲染示例'),
),
body: MarkdownBrowser(
data: markdownText,
style: MarkdownStyle(
h1: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
h2: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
p: TextStyle(fontSize: 16),
),
onTapLink: (String url) {
print('点击链接: $url');
},
),
);
}
}