Code Block
スクロール可能な等幅サーフェスに複数行のコードを表示します。
任意のテーマ対応構文ハイライトと明示的な折り返しで、複数行のコードを表示します。
主なプロパティ
| プロパティ | 値 | 既定値 |
|---|---|---|
language | 設定したハイライターが処理する識別子 | プレーンテキスト |
ハイライター | highlighter プロパティ、TRCodeHighlighterProvider、なし | なし |
構文テーマ | 明るさごとにアプリケーションのハイライターが定義 | プレーンテキストの色 |
wrap | true、false | false |
インストール
パッケージを追加し、公開ライブラリをインポートしてください。
flutter pub add tinyrack_uiimport 'package:tinyrack_ui/tinyrack_ui.dart';アプリケーションで使う構文エンジンを TRCodeHighlighter に適合させ、コードブロックの上位に設定します。対応言語、トークンスタイル、ライト・ダークの色はハイライターが管理し、null を返すと言語が未対応であることを示します。
import 'package:material_ui/material_ui.dart';
import 'package:tinyrack_ui/tinyrack_ui.dart';
final dartKeywords = RegExp(r'\b(class|const|final|return|void)\b');
Future<TRCodeHighlightResult?> appCodeHighlighter(
TRCodeHighlightRequest request,
) async {
if (request.language != 'dart') return null;
final keywordColor = request.brightness == Brightness.dark
? Colors.lightBlueAccent
: Colors.blue;
final spans = <TextSpan>[];
var offset = 0;
for (final match in dartKeywords.allMatches(request.code)) {
if (match.start > offset) {
spans.add(TextSpan(text: request.code.substring(offset, match.start)));
}
spans.add(
TextSpan(
text: match.group(0),
style: TextStyle(color: keywordColor),
),
);
offset = match.end;
}
if (offset < request.code.length) {
spans.add(TextSpan(text: request.code.substring(offset)));
}
return TRCodeHighlightResult(span: TextSpan(children: spans));
}
void main() {
runApp(
TRCodeHighlighterProvider(
highlighter: appCodeHighlighter,
child: const App(),
),
);
}
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: TinyrackTheme.light(),
darkTheme: TinyrackTheme.dark(),
home: const Scaffold(
body: TRCodeBlock(
code: 'final status = "healthy";',
language: 'dart',
),
),
);
}
}プレイグラウンド
使用方法
import 'package:material_ui/material_ui.dart';
import 'package:tinyrack_ui/tinyrack_ui.dart';
const TRCodeBlock(
code: "final status = 'healthy';",
language: 'dart',
)例
ハイライトされた Dart パーマリンク
ハイライターを設定した後に language を渡すと、テーマに対応した構文色を表示できます。
表示モード パーマリンク
プレーンテキストでは language を省略し、ハイライトにはハイライターが対応する識別子を選び、幅が限られるレイアウトでは wrap を有効にします。
ブロック単位の上書き パーマリンク
1 つのブロックだけプロバイダーと異なる対応言語やトークン色が必要な場合は、highlighter を直接渡します。
末尾のアクション パーマリンク
trailing を渡すと、コードにかからない右上の角にアクションを固定できます。折り返さないブロックは、ポインターが端を越えてドラッグしている間に横スクロールするため、長い行の末尾まで選択できます。
API
ハイライター未設定、未対応言語、例外のいずれでも元のソースを表示し続けます。ブロックまたはプロバイダーの onHighlightFailure で結果を処理してください。
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
code | String | 必須 | 表示するソーステキストです。 |
language | String? | null | ハイライターに渡す言語識別子です。プレーンテキストでは省略します。 |
highlighter | TRCodeHighlighter? | プロバイダー値 | このブロックだけプロバイダーを上書きします。 |
onHighlightFailure | ValueChanged<TRCodeHighlightFailure>? | プロバイダー値 | noHighlighter、unsupportedLanguage、highlightFailed を受け取ります。 |
wrap | bool | false | 水平スクロールの代わりに長い行を折り返します。 |