gpt4 book ai didi

flutter - TextField 中文本的样式部分

转载 作者:IT王子 更新时间:2023-10-29 06:58:30 30 4
gpt4 key购买 nike

我正在实现一个自定义文本字段,并且我想在用户输入时将某些关键字(即主题标签)设置为与其余文本不同的样式。

有点像这样:

enter image description here

有没有办法在 Flutter 中做到这一点?

最佳答案

这个问题与How to change color of particular text in a text field dynamically?非常相似

我在那里回答:https://stackoverflow.com/a/57846261/5280562

简而言之:您可以扩展 EditableText 小部件,包括它的 EditableTextState 类并覆盖 buildTextSpan 方法。

下面是我在我的应用程序中使用的名为 AnnotatedEditableText 的工作示例。您需要提供一个 Annotation 对象列表,这些对象描述需要突出显示的文本范围以及要使用的样式。

import 'package:flutter/widgets.dart';

class Annotation extends Comparable<Annotation> {
Annotation({@required this.range, this.style});
final TextRange range;
final TextStyle style;

@override
int compareTo(Annotation other) {
return range.start.compareTo(other.range.start);
}

@override
String toString() {
return 'Annotation(range:$range, style:$style)';
}
}

class AnnotatedEditableText extends EditableText {
AnnotatedEditableText({
Key key,
FocusNode focusNode,
TextEditingController controller,
TextStyle style,
ValueChanged<String> onChanged,
ValueChanged<String> onSubmitted,
Color cursorColor,
Color selectionColor,
TextSelectionControls selectionControls,
this.annotations,
}) : super(
key: key,
focusNode: focusNode,
controller: controller,
cursorColor: cursorColor,
style: style,
keyboardType: TextInputType.text,
autocorrect: true,
autofocus: true,
selectionColor: selectionColor,
selectionControls: selectionControls,
onChanged: onChanged,
onSubmitted: onSubmitted,
);

final List<Annotation> annotations;

@override
AnnotatedEditableTextState createState() => new AnnotatedEditableTextState();
}

class AnnotatedEditableTextState extends EditableTextState {
@override
AnnotatedEditableText get widget => super.widget;

List<Annotation> getRanges() {
var source = widget.annotations;
source.sort();
var result = new List<Annotation>();
Annotation prev;
for (var item in source) {
if (prev == null) {
// First item, check if we need one before it.
if (item.range.start > 0) {
result.add(new Annotation(
range: TextRange(start: 0, end: item.range.start),
));
}
result.add(item);
prev = item;
continue;
} else {
// Consequent item, check if there is a gap between.
if (prev.range.end > item.range.start) {
// Invalid ranges
throw new StateError(
'Invalid (intersecting) ranges for annotated field');
} else if (prev.range.end < item.range.start) {
result.add(Annotation(
range: TextRange(start: prev.range.end, end: item.range.start),
));
}
// Also add current annotation
result.add(item);
prev = item;
}
}
// Also check for trailing range
final String text = textEditingValue.text;
if (result.last.range.end < text.length) {
result.add(Annotation(
range: TextRange(start: result.last.range.end, end: text.length),
));
}
return result;
}

@override
TextSpan buildTextSpan() {
final String text = textEditingValue.text;

if (widget.annotations != null) {
var items = getRanges();
var children = <TextSpan>[];
for (var item in items) {
children.add(
TextSpan(style: item.style, text: item.range.textInside(text)),
);
}
return new TextSpan(style: widget.style, children: children);
}

return new TextSpan(style: widget.style, text: text);
}
}

它也可以在这个 Gist 中找到:https://gist.github.com/pulyaevskiy/d7af7217c2e71f31dfb78699f91dfbb5

关于flutter - TextField 中文本的样式部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54623798/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com