Ein anpassbares Codeltextfeld unterstützt die Syntax -Hervorhebung
Eine Live -Demo, die ein paar Sprach- / Themenkombinationen zeigt
Der experimentelle VM DLOX verwendet Codefield in seinem Online -Editor
Code -Modifikatoren helfen bei der automatischen Verwaltung von Einklappen
Der Editor ist in einen horizontalen Scroll -Container eingewickelt, um lange Leitungen zu verarbeiten
Fügen Sie in der pubspec.yaml Ihres Flutter -Projekts die folgende Abhängigkeit hinzu:
dependencies :
...
code_text_field : <latest_version>Neueste Version
Fügen Sie in Ihrer Bibliothek den folgenden Import hinzu:
import 'package:code_text_field/code_text_field.dart' ;Ein Codefield -Widget arbeitet mit einem CodeController , der die Texteingabe dynamisch entsprechend einer Sprache analysiert und mit einer Themenkarte macht
import 'package:flutter/material.dart' ;
import 'package:code_text_field/code_text_field.dart' ;
// Import the language & theme
import 'package:highlight/languages/dart.dart' ;
import 'package:flutter_highlight/themes/monokai-sublime.dart' ;
class CodeEditor extends StatefulWidget {
@override
_CodeEditorState createState () => _CodeEditorState ();
}
class _CodeEditorState extends State < CodeEditor > {
CodeController ? _codeController;
@override
void initState () {
super . initState ();
final source = "void main() { n print( " Hello, world! " ); n }" ;
// Instantiate the CodeController
_codeController = CodeController (
text : source,
language : dart,
);
}
@override
void dispose () {
_codeController ? . dispose ();
super . dispose ();
}
@override
Widget build ( BuildContext context) {
return CodeTheme (
data : const CodeThemeData (styles : monokaiSublimeTheme),
child : CodeField (
controller : _codeController ! ,
textStyle : const TextStyle (fontFamily : 'SourceCode' ),
),
);
}
}Hier wurde der Monospace Font Source Code Pro in den Ordner Assets und in die Datei pubSpec.yaml hinzugefügt.
Zusätzlich zur Sprachdefinition kann das Wort in Bezug auf das Wort im Bereich StringMap angegeben werden
_codeController = CodeController (
//...
stringMap : {
"Hello" : TextStyle (fontWeight : FontWeight .bold, color : Colors .red),
"world" : TextStyle (fontStyle : FontStyle .italic, color : Colors .green),
},
);Mit der Mustermap können auch komplexere Regexes verwendet werden. Wenn jedoch eine Sprache verwendet wird, haben ihre Regexes -Muster Vorrang vor Mustermap und StringMap .
_codeController = CodeController (
//...
patternMap : {
r"B#[a-zA-Z0-9]+b" :
TextStyle (fontWeight : FontWeight .bold, color : Colors .purpleAccent),
},
);Sowohl Mustermap als auch StringMap können verwendet werden, ohne eine Sprache anzugeben.
_codeController = CodeController (
text : source,
patternMap : {
r'".*"' : TextStyle (color : Colors .yellow),
r'[a-zA-Z0-9]+(.*)' : TextStyle (color : Colors .green),
},
stringMap : {
"void" : TextStyle (fontWeight : FontWeight .bold, color : Colors .red),
"print" : TextStyle (fontWeight : FontWeight .bold, color : Colors .blue),
},
);Code -Modifikatoren können erstellt werden, um auf spezielle Tastenanschläge zu reagieren. Die Standardmodifikatoren verarbeiten die Registerkarte für Speicherplatz und automatische Eindrückung. Hier ist die Implementierung des Standard -Tabmodifiers
class TabModifier extends CodeModifier {
const TabModifier () : super ( ' t ' );
@override
TextEditingValue ? updateString (
String text, TextSelection sel, EditorParams params) {
final tmp = replace (text, sel.start, sel.end, " " * params.tabSpaces);
return tmp;
}
} const CodeField ({
Key ? key,
required this .controller,
this .minLines,
this .maxLines,
this .expands = false ,
this .wrap = false ,
this .background,
this .decoration,
this .textStyle,
this .padding = EdgeInsets .zero,
this .lineNumberStyle = const LineNumberStyle (),
this .enabled,
this .onTap,
this .readOnly = false ,
this .cursorColor,
this .textSelectionTheme,
this .lineNumberBuilder,
this .focusNode,
this .onChanged,
this .isDense = false ,
this .smartQuotesType,
this .keyboardType,
this .lineNumbers = true ,
this .horizontalScroll = true ,
this .selectionControls,
this .hintText,
this .hintStyle,
}) const LineNumberStyle ({
this .width = 42.0 ,
this .textAlign = TextAlign .right,
this .margin = 10.0 ,
this .textStyle,
this .background,
}); CodeController ({
String ? text,
Mode ? language,
this .patternMap,
this .stringMap,
this .params = const EditorParams (),
this .modifiers = const [
IndentModifier (),
CloseBlockModifier (),
TabModifier (),
],
}) In Flutter Beta, Dev & Master -Kanälen wurde eine wechselnde Änderung des TextEditingController eingeführt. Die Branch Beta sollte diesen Änderungen einhalten.