Flutter代码高亮插件any_syntax_highlighter的使用

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

Flutter代码高亮插件 any_syntax_highlighter 的使用

any_syntax_highlighter 是一个轻量级的基于约定的语法高亮插件,它为输入的文本代码提供高亮显示。以下是该插件的详细使用说明。

特性

  • 添加自定义关键字或使用默认的关键字。
  • 基于约定的高亮显示:
    • 以大写字母开头的标识符被视为类/构造函数。
    • Class.abc 表示静态变量。
    • 支持三种类型的注释:
      • 单行注释以 # 开头。
      • 单行注释以 // 开头。
      • 多行注释 /*...*/
    • _ 开头的标识符表示私有。
    • . 操作符之后的函数被视为方法(函数和方法的高亮显示不同)。
  • 使用 Google 字体(感谢 google_fonts 库)。

注意:从 v0.0.12 版本开始,boxDecoration 已更改为 decoration

开始使用

首先导入包:

import 'package:any_syntax_highlighter/any_syntax_highlighter.dart';

基本用法

AnySyntaxHighlighter(
  '''Class Main{
  public static void main(String args[]){
    
  }
}'''
)

可选字段的用法

AnySyntaxHighlighter(
          '#your code goes here',
          fontSize: 16,
          lineNumbers: false, // 默认为 false
          theme: AnySyntaxHighlighterThemeCollection.githubWebTheme(), // 可以创建并传递自定义主题
          isSelectableText: true, // 创建 SelectableText.rich() 小部件,使文本可选择(默认为 false)
          useGoogleFont: 'Lato',
          copyIcon: const Icon(Icons.copy_rounded,color:Colors.black),// 默认是白色图标
          hasCopyButton: true,// 默认为 false
          /* 其他选项包括:
          padding,
          margin,
          textAlign,
          textDirection,
          softWrap,
          overflow,
          textScaleFactor,
          maxLines,
          locale,
          strutStyle,
          textWidthBasis,
          textHeightBehavior,
          overrideDecoration
          */
)

使用 Google 字体

你可以添加任何在 google_fonts 库中可用的 Google 字体。只需将你想要使用的字体名称作为字符串传递给 useGoogleFont 属性。

AnySyntaxHighlighter(
  '// google fonts usage demo',
  useGoogleFont: 'Lato'
)

不要忘记为所使用的字体添加适当的许可证,更多详情请阅读 google_fonts 文档

示例 Demo

以下是一个完整的示例应用程序,展示了如何使用 any_syntax_highlighter 插件:

import 'dart:ui';
import 'package:any_syntax_highlighter/any_syntax_highlighter.dart';
import 'package:any_syntax_highlighter/themes/any_syntax_highlighter_theme.dart';
import 'package:any_syntax_highlighter/themes/any_syntax_highlighter_theme_collection.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const ExampleApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MainApp(),
    );
  }
}

class MainApp extends StatefulWidget {
  const MainApp({Key? key}) : super(key: key);

  [@override](/user/override)
  _MainAppState createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  String _text = '';
  late Map<String, Props> _theme;
  late Color _bgColor;

  [@override](/user/override)
  void initState() {
    super.initState();
    initializeTheme();
  }

  void initializeTheme() {
    _bgColor = Colors.black;
    _theme = {
      'classStyle': Props(Colors.cyanAccent, 'normal', 'normal'),
      'staticStyle': Props(Colors.pinkAccent, 'normal', 'normal'),
      'constructor': Props(Colors.orangeAccent, 'normal', 'normal'),
      'multilineComment': Props(Colors.red, 'normal', 'italic'),
      'comment': Props(Colors.red, 'normal', 'italic'),
      'keyword': Props(Colors.blueAccent, 'bold', 'normal'),
      'identifier': Props(Colors.white, 'normal', 'normal'),
      'function': Props(Colors.greenAccent, 'normal', 'normal'),
      'number': Props(Colors.yellowAccent, 'normal', 'normal'),
      'string': Props(Colors.lightGreen, 'normal', 'normal'),
      'operator': Props(Colors.deepOrange, 'normal', 'normal'),
      'separator': Props(Colors.white, 'normal', 'normal'),
      'method': Props(Colors.lightBlueAccent, 'normal', 'normal'),
      'private': Props(Colors.grey, 'normal', 'normal'),
      'lineNumber': Props(Colors.white, 'normal', 'normal')
    };
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('AnySyntaxHighlighter Example'),
      ),
      body: Column(
        children: [
          Expanded(
            child: AnySyntaxHighlighter(
              _text,
              fontSize: 16,
              lineNumbers: true,
              theme: AnySyntaxHighlighterTheme(
                classStyle: TextStyle(
                  color: _theme['classStyle']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                staticStyle: TextStyle(
                  color: _theme['staticStyle']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                constructor: TextStyle(
                  color: _theme['constructor']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                multilineComment: TextStyle(
                  color: _theme['multilineComment']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.italic,
                ),
                comment: TextStyle(
                  color: _theme['comment']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.italic,
                ),
                keyword: TextStyle(
                  color: _theme['keyword']?.color,
                  fontWeight: FontWeight.bold,
                  fontStyle: FontStyle.normal,
                ),
                identifier: TextStyle(
                  color: _theme['identifier']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                function: TextStyle(
                  color: _theme['function']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                number: TextStyle(
                  color: _theme['number']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                string: TextStyle(
                  color: _theme['string']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                operator: TextStyle(
                  color: _theme['operator']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                separator: TextStyle(
                  color: _theme['separator']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                method: TextStyle(
                  color: _theme['method']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                private: TextStyle(
                  color: _theme['private']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                lineNumber: TextStyle(
                  color: _theme['lineNumber']?.color,
                  fontWeight: FontWeight.normal,
                  fontStyle: FontStyle.normal,
                ),
                decoration: BoxDecoration(color: _bgColor),
              ),
            ),
          ),
          Expanded(
            child: TextField(
              minLines: 1,
              maxLines: 1000,
              onChanged: (String v) {
                setState(() {
                  _text = v;
                });
              },
            ),
          ),
        ],
      ),
    );
  }
}

class Props {
  Color color;
  String weight, style;

  Props(this.color, this.weight, this.style);
}

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

1 回复

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


当然,关于在Flutter中使用any_syntax_highlighter插件来实现代码高亮,以下是一个具体的代码案例,展示了如何集成和使用该插件。

首先,确保你已经在pubspec.yaml文件中添加了any_syntax_highlighter依赖:

dependencies:
  flutter:
    sdk: flutter
  any_syntax_highlighter: ^x.y.z  # 请替换为最新版本号

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

接下来是一个完整的示例,展示如何在Flutter应用中使用any_syntax_highlighter插件来显示并高亮代码:

import 'package:flutter/material.dart';
import 'package:any_syntax_highlighter/any_syntax_highlighter.dart';
import 'package:any_syntax_highlighter/themes/monokai-sublime.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Code Highlighter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CodeHighlighterScreen(),
    );
  }
}

class CodeHighlighterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String code = '''
void main() {
  print("Hello, World!");
}
    ''';

    return Scaffold(
      appBar: AppBar(
        title: Text('Code Highlighter Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: SyntaxHighlighter(
          code,
          [
            DartSyntaxHighlighter(), // 使用Dart语言的高亮规则
          ],
          theme: monokaiSublimeTheme, // 使用Monokai主题
          textStyle: TextStyle(fontSize: 16),
          padding: EdgeInsets.all(16.0),
          borderRadius: BorderRadius.circular(8.0),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,包含一个CodeHighlighterScreen页面。在这个页面中,我们定义了一段Dart代码,并使用SyntaxHighlighter小部件来显示并高亮这段代码。

  • code字符串包含了我们想要高亮显示的代码。
  • DartSyntaxHighlighter()提供了Dart语言的高亮规则。
  • monokaiSublimeTheme是我们选择的主题,你可以根据需要选择其他主题。
  • textStylepaddingborderRadius等参数用于自定义高亮显示的样式和布局。

请注意,any_syntax_highlighter插件可能支持多种编程语言的高亮规则,你需要确保已经导入了相应语言的语法高亮类(如DartSyntaxHighlighter)。

运行这个示例应用,你应该能看到一段高亮显示的Dart代码。希望这个示例对你有所帮助!

回到顶部