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

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

example_screenshot

这是一个基于下面示例代码实现的效果,并不是直接运行该示例代码的结果。

此插件是flutter_highlight的一个分支,增加了行号功能。

使用方法

import 'package:flutter/material.dart';
import 'package:flutter_highlight/flutter_highlight.dart';
import 'package:flutter_highlight/themes/github.dart';

class MyWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    var code = '''main() {
  print("Hello, World!");
}
''';

    return HighlightView(
      // 要高亮显示的原始代码
      code,

      // 指定语言
      // 为了提高性能建议指定语言
      language: 'dart',

      // 指定高亮主题
      // 可用的主题列表在`themes`文件夹内
      theme: githubTheme,

      // 指定填充
      padding: EdgeInsets.all(12),

      // 指定文本样式
      textStyle: TextStyle(
        fontFamily: 'My awesome monospace font',
        fontSize: 16,
      ),
      
      // 启用行号
      lineNumbers: true,
      
      // 行号容器边框
      lineNumbersBorder: Border.all(color: Colors.grey, width: 0),
      
      // 行号容器圆角
      lineNumbersRadius: const BorderRadius.only(
        bottomLeft: Radius.circular(15), 
        topLeft: Radius.circular(15)),
    );
  }
}

完整示例代码

import 'package:flutter/material.dart';
import 'package:flutter_highlight/flutter_highlight.dart';
import 'package:flutter_highlight/theme_map.dart';
import 'package:url_launcher/url_launcher.dart';
import 'example_map.dart';

void main() => runApp(MyApp());

final title = 'Flutter Highlight Gallery';

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: title,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String language = 'dart';
  String theme = 'a11y-dark';

  Widget _buildMenuContent(String text) {
    return Container(
      padding: EdgeInsets.symmetric(horizontal: 12),
      child: Row(children: [
        Text(text, style: TextStyle(fontSize: 16)),
        Icon(Icons.arrow_drop_down)
      ]),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
        actions: [
          PopupMenuButton(
            child: _buildMenuContent(language),
            itemBuilder: (context) {
              return exampleMap.keys.map((key) {
                return CheckedPopupMenuItem(
                  value: key,
                  child: Text(key),
                  checked: language == key,
                );
              }).toList();
            },
            onSelected: (selected) {
              if (selected != null) {
                setState(() {
                  language = selected;
                });
              }
            },
          ),
          PopupMenuButton<String>(
            child: _buildMenuContent(theme),
            itemBuilder: (context) {
              return themeMap.keys.map((key) {
                return CheckedPopupMenuItem(
                  value: key,
                  child: Text(key),
                  checked: theme == key,
                );
              }).toList();
            },
            onSelected: (selected) {
              if (selected != null) {
                setState(() {
                  theme = selected;
                });
              }
            },
          ),
          IconButton(
            icon: const Icon(Icons.code),
            tooltip: 'Source Code',
            onPressed: () {
              launch('https://github.com/pd4d10/highlight');
            },
          )
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            HighlightView(
              exampleMap[language],
              language: language,
              theme: themeMap[theme],
              padding: EdgeInsets.all(12),
              textStyle: TextStyle(
                  fontFamily:
                      'SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace'),
            )
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


flutter_highlight2 是一个用于在 Flutter 应用中实现代码高亮显示的插件。它是基于 highlight.js 的,支持多种编程语言的语法高亮。

安装

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

dependencies:
  flutter:
    sdk: flutter
  flutter_highlight: ^2.0.0

然后运行 flutter pub get 来安装依赖。

基本使用

以下是一个简单的示例,展示如何使用 flutter_highlight 来高亮显示代码。

import 'package:flutter/material.dart';
import 'package:flutter_highlight/flutter_highlight.dart';
import 'package:flutter_highlight/themes/github.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Code Highlight Example')),
        body: CodeHighlightExample(),
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: HighlightView(
        code,
        language: 'dart',
        theme: githubTheme,
        padding: EdgeInsets.all(16),
        textStyle: TextStyle(fontFamily: 'monospace', fontSize: 14),
      ),
    );
  }
}

说明

  • HighlightView 是一个用于显示代码高亮的组件。
  • language 参数指定代码的语言(如 dart, java, python 等)。
  • theme 参数指定代码高亮的主题(如 githubTheme)。
  • textStyle 可以设置代码的字体和大小。

其他主题

flutter_highlight 提供了多种主题,你可以通过导入不同的主题来改变代码高亮的样式。例如:

import 'package:flutter_highlight/themes/darcula.dart';

然后在 HighlightView 中使用该主题:

theme: darculaTheme,
回到顶部