Flutter代码高亮显示插件syntax_highlight的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter代码高亮显示插件syntax_highlight的使用

Syntax Highlight

Syntax Highlight 包使用 TextMate 规则来高亮显示代码,这与许多流行的应用程序(如 VSCode)中使用的规则相同。目前支持的语言有 Dart、SQL (Postgres) 和 YAML,但通过在 grammar 目录下添加新的语法文件,很容易扩展对其他语言的支持。

使用方法

初始化 Highlighter 类

在使用 Highlighter 类之前,需要对其进行初始化。初始化将加载请求的语法文件并解析它们。

// Initialize the highlighter.
await Highlighter.initialize(['dart', 'yaml', 'sql']);

加载主题并创建 Highlighter 实例

接下来,加载一个主题并创建一个 Highlighter 实例。

// Load the default light theme and create a highlighter.
var theme = await HighlighterTheme.loadLightTheme();
var highlighter = Highlighter(
  language: 'dart',
  theme: theme,
);

高亮显示代码

现在,可以通过调用 highlight 方法来高亮显示代码。highlight 方法将返回一个 TextSpan,可以在 Text 小部件中使用。

Widget build(BuildContext context) {
  var highlightedCode = highlighter.highlight(myCodeString);
  return Text.rich(highlightedCode);
}

示例中高亮显示的代码如下图所示: Highlighted code

完整示例 Demo

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 syntax_highlight 插件来高亮显示不同语言的代码:

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:syntax_highlight/syntax_highlight.dart';

// Example code.
const _code = '''class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Syntax Highlight Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}''';

const _serverpodYaml = '''
class: Customer
table: customer
fields:
  name: String
  orders: List<Order>?, relation
''';

const _json = '{"name":"John", "age":30, "car":null}';

late final Highlighter _dartLightHighlighter;
late final Highlighter _dartDarkHighlighter;
late final Highlighter _serverpodProtocolLightYamlHighlighter;
late final Highlighter _serverpodProtocolDarkYamlHighlighter;
late final Highlighter _jsonLightHighlighter;
late final Highlighter _jsonDarkHighlighter;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize the highlighter.
  await Highlighter.initialize([
    'dart',
    'yaml',
    'sql',
    'serverpod_protocol',
    'json',
  ]);

  // Load the default light theme and create a highlighter.
  var lightTheme = await HighlighterTheme.loadLightTheme();
  _dartLightHighlighter = Highlighter(
    language: 'dart',
    theme: lightTheme,
  );
  _serverpodProtocolLightYamlHighlighter = Highlighter(
    language: 'serverpod_protocol',
    theme: lightTheme,
  );
  _jsonLightHighlighter = Highlighter(
    language: 'json',
    theme: lightTheme,
  );

  // Load the default dark theme and create a highlighter.
  var darkTheme = await HighlighterTheme.loadDarkTheme();
  _dartDarkHighlighter = Highlighter(
    language: 'dart',
    theme: darkTheme,
  );
  _serverpodProtocolDarkYamlHighlighter = Highlighter(
    language: 'serverpod_protocol',
    theme: darkTheme,
  );
  _jsonDarkHighlighter = Highlighter(
    language: 'json',
    theme: darkTheme,
  );

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Syntax Highlight Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          Container(
            padding: const EdgeInsets.all(16),
            color: Colors.white,
            child: Text.rich(
              // Highlight the code.
              _dartLightHighlighter.highlight(_code),
              style: GoogleFonts.jetBrainsMono(
                fontSize: 14,
                height: 1.3,
              ),
            ),
          ),
          Container(
            padding: const EdgeInsets.all(16),
            color: Colors.black,
            child: Text.rich(
              // Highlight the code.
              _dartDarkHighlighter.highlight(_code),
              style: GoogleFonts.jetBrainsMono(
                fontSize: 14,
                height: 1.3,
              ),
            ),
          ),
          Container(
            padding: const EdgeInsets.all(16),
            color: Colors.white,
            child: Text.rich(
              // Highlight the code.
              _serverpodProtocolLightYamlHighlighter.highlight(_serverpodYaml),
              style: GoogleFonts.jetBrainsMono(
                fontSize: 14,
                height: 1.3,
              ),
            ),
          ),
          Container(
            padding: const EdgeInsets.all(16),
            color: Colors.black,
            child: Text.rich(
              // Highlight the code.
              _serverpodProtocolDarkYamlHighlighter.highlight(_serverpodYaml),
              style: GoogleFonts.jetBrainsMono(
                fontSize: 14,
                height: 1.3,
              ),
            ),
          ),
          Container(
            padding: const EdgeInsets.all(16),
            color: Colors.white,
            child: Text.rich(
              // Highlight the code.
              _jsonLightHighlighter.highlight(_json),
              style: GoogleFonts.jetBrainsMono(
                fontSize: 14,
                height: 1.3,
              ),
            ),
          ),
          Container(
            padding: const EdgeInsets.all(16),
            color: Colors.black,
            child: Text.rich(
              // Highlight the code.
              _jsonDarkHighlighter.highlight(_json),
              style: GoogleFonts.jetBrainsMono(
                fontSize: 14,
                height: 1.3,
              ),
            ),
          ),
        ],
      ),
    );
  }
}

此示例展示了如何使用 syntax_highlight 插件在 Flutter 应用中高亮显示 Dart、YAML 和 JSON 代码,并且同时支持浅色和深色主题。希望这个例子能帮助你更好地理解和使用该插件。


更多关于Flutter代码高亮显示插件syntax_highlight的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter代码高亮显示插件syntax_highlight的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,syntax_highlight 是一个在 Flutter 中用于代码高亮显示的插件。以下是如何在 Flutter 项目中使用 syntax_highlight 插件的示例代码。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 syntax_highlight 依赖:

dependencies:
  flutter:
    sdk: flutter
  syntax_highlight: ^0.2.0  # 请根据需要替换为最新版本

2. 安装依赖

运行以下命令以安装依赖:

flutter pub get

3. 使用插件

以下是一个完整的 Flutter 应用示例,展示如何使用 syntax_highlight 插件进行代码高亮显示:

import 'package:flutter/material.dart';
import 'package:syntax_highlight/syntax_highlight.dart';
import 'package:syntax_highlight/themes/monokai-sublime.dart'; // 你可以选择其他主题

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Syntax Highlight Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String code = '''
  void main() {
    print("Hello, World!");
  }
  ''';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Syntax Highlight Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: SyntaxHighlighter(
          code,
          [
            DartLanguage(), // 指定语言为 Dart
          ],
          theme: monokaiSublimeTheme, // 使用 Monokai Sublime 主题
          padding: EdgeInsets.all(16.0),
          textStyle: TextStyle(fontSize: 16),
        ),
      ),
    );
  }
}

4. 定义语言支持

在上述代码中,我们使用了 DartLanguage() 来指定代码语言。syntax_highlight 插件支持多种编程语言,你可以根据需要引入相应的语言支持。例如,如果你想高亮显示 JavaScript 代码,你可以这样做:

import 'package:syntax_highlight/languages/javascript.dart';

// ...

child: SyntaxHighlighter(
  code,
  [
    JavaScriptLanguage(), // 指定语言为 JavaScript
  ],
  theme: monokaiSublimeTheme,
  padding: EdgeInsets.all(16.0),
  textStyle: TextStyle(fontSize: 16),
),

5. 选择主题

syntax_highlight 插件提供了多种内置主题,你可以在 themes 文件夹中找到它们。例如,你还可以使用 draculaThemegithubTheme 等。

import 'package:syntax_highlight/themes/dracula.dart';

// ...

child: SyntaxHighlighter(
  code,
  [
    DartLanguage(),
  ],
  theme: draculaTheme, // 使用 Dracula 主题
  padding: EdgeInsets.all(16.0),
  textStyle: TextStyle(fontSize: 16),
),

总结

以上代码展示了如何在 Flutter 项目中使用 syntax_highlight 插件进行代码高亮显示。你可以根据需要调整代码语言、主题和样式。希望这个示例对你有帮助!

回到顶部