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

Flutter中ABC记谱法转乐谱的实现方案咨询

在Flutter中实现ABC记谱法转可视化乐谱的方案

方案一:通过WebView集成ABCjs(最稳定可靠)

React生态的ABCjs是处理ABC记谱的成熟工具,在Flutter中可以直接通过WebView复用它的能力,这比依赖不稳定的Flutter专用包更靠谱。具体步骤如下:

  1. 添加依赖
    在pubspec.yaml中引入webview_flutter包:
dependencies:
  webview_flutter: ^4.4.0
  1. 创建本地HTML文件
    在项目的assets目录下创建abc_renderer.html,内容如下:
<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/abcjs@6.2.2/dist/abcjs-basic-min.js"></script>
    <style>
        #score { width: 100%; }
    </style>
</head>
<body>
    <div id="score"></div>
    <script>
        function renderABC(abcText) {
            const scoreElement = document.getElementById('score');
            scoreElement.innerHTML = '';
            ABCJS.renderAbc(scoreElement, abcText, { responsive: 'resize' });
        }
    </script>
</body>
</html>

记得在pubspec.yaml中声明assets:

assets:
  - assets/abc_renderer.html
  1. Flutter代码实现
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class ABCScoreViewer extends StatefulWidget {
  final String abcText;

  const ABCScoreViewer({super.key, required this.abcText});

  @override
  State<ABCScoreViewer> createState() => _ABCScoreViewerState();
}

class _ABCScoreViewerState extends State<ABCScoreViewer> {
  late WebViewController _controller;

  @override
  void initState() {
    super.initState();
    _controller = WebViewController()
      ..loadFlutterAsset('assets/abc_renderer.html')
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..addJavaScriptChannel('ABCChannel', onMessageReceived: (message) {});

    // 页面加载完成后注入ABC文本
    _controller.setNavigationDelegate(NavigationDelegate(
      onPageFinished: (url) {
        _controller.runJavaScript('renderABC(`${widget.abcText.replaceAll('`', '\\`')}`)');
      },
    ));
  }

  @override
  Widget build(BuildContext context) {
    return WebViewWidget(controller: _controller);
  }
}

// 使用示例
void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(title: const Text('Full Of Joy Score')),
      body: ABCScoreViewer(
        abcText: '''X: 2
T: Full Of Joy
R: polka
M: 2/4
L: 1/8
K: Gmaj
[M:4/4]
d2 de d2 cA|d2 de d2 cA|dedA dedA|c2 BA GA B2|d2 de d2 cA|
ddde d2 cA|dedA dedA|GAED G2 z2||Bc B2 AB A2|GABc A4|c3 B ABAG|
FGAB ABAG|AAAB AAAB|AAAd c3 B|ABcd BcAF|G4 [g2B2D2] z2||
|:d6 eg|d6 e2|g2 ag ed ^c2|d6 z2|d3 e g2 a2|bd' a2 a2 g2|
e3 d ^cd e2|d6 z2|g3 a g2 e2|d3 e g2 a2|dega dged|
A2 =c2c2 BA|d2 d2 d2 eg|d6 cB|ABAG FGAF|G6 z2:|''',
      ),
    ),
  ));
}

方案二:尝试维护活跃的Flutter专用包

如果不想用WebView,可以尝试pub.dev上维护状态较好的包:

  • abc_parser:可解析ABC记谱的结构,你可以基于解析结果自定义绘制乐谱(需自行实现UI渲染)
  • flutter_music_notes:虽不直接处理ABC,但可辅助构建乐谱UI,配合解析后的ABC数据使用

不过这类包的功能完整性普遍不如ABCjs,若需要复杂排版和渲染效果,优先推荐WebView方案。

关于sheet_music包

该包已长时间未更新,存在兼容性问题,不建议继续使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:46:05