You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中实现多语言代码彩色格式化展示并加载指定URL代码

在Flutter中实现多语言代码查看器展示外部URL代码

完全可行,flutter_markdown仅能实现基础代码块渲染,要获得专业的多语言语法高亮、更丰富的代码展示能力,推荐使用专门的代码高亮组件,以下是具体实现方案:

核心实现思路:网络请求获取代码 + 专业代码高亮组件渲染

1. 准备依赖包

在pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^1.1.0
  flutter_highlight: ^0.7.0
  highlight: ^0.1.5
  clipboard: ^0.1.3

2. 获取外部URL的代码内容

用http包发起GET请求,抓取目标URL中的JS代码文本:

import 'package:http/http.dart' as http;

Future<String> fetchCodeFromUrl(String url) async {
  final response = await http.get(Uri.parse(url));
  if (response.statusCode == 200) {
    return response.body;
  } else {
    throw Exception('加载代码失败');
  }
}

3. 用flutter_highlight实现语法高亮展示

flutter_highlight支持100+编程语言的语法高亮,内置多种预设主题(如Monokai、GitHub),以下是完整页面示例:

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

class CodeViewerPage extends StatefulWidget {
  final String codeUrl;
  const CodeViewerPage({super.key, required this.codeUrl});

  @override
  State<CodeViewerPage> createState() => _CodeViewerPageState();
}

class _CodeViewerPageState extends State<CodeViewerPage> {
  late Future<String> _codeFuture;

  @override
  void initState() {
    super.initState();
    _codeFuture = fetchCodeFromUrl(widget.codeUrl);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('代码查看器'),
        actions: [
          IconButton(
            icon: const Icon(Icons.copy),
            onPressed: () async {
              final code = await _codeFuture;
              await FlutterClipboard.copy(code);
              ScaffoldMessenger.of(context).showSnackBar(
                const SnackBar(content: Text('代码已复制到剪贴板')),
              );
            },
          )
        ],
      ),
      body: FutureBuilder<String>(
        future: _codeFuture,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return SingleChildScrollView(
              padding: const EdgeInsets.all(16),
              child: HighlightView(
                snapshot.data!,
                language: 'javascript',
                theme: monokaiTheme,
                padding: const EdgeInsets.all(12),
                textStyle: const TextStyle(
                  fontFamily: 'Courier',
                  fontSize: 14,
                ),
              ),
            );
          } else if (snapshot.hasError) {
            return Center(child: Text('${snapshot.error}'));
          }
          return const Center(child: CircularProgressIndicator());
        },
      ),
    );
  }
}

4. 进阶功能拓展建议

  • 行号显示:自定义横向布局,将行号列表与代码区域拼接,实现行号与代码的对应
  • 主题切换:利用flutter_highlight的内置主题,提供下拉菜单让用户切换高亮样式
  • 代码折叠:结合expandable包,实现函数、块级代码的折叠/展开功能
  • 静态检查:复杂场景下可集成对应语言的LSP服务,实现语法错误提示

内容的提问来源于stack exchange,提问作者Nijat Namazzade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:10:11