Flutter 如何更改TextField小部件中几个单词的颜色?
我试图做聊天提及,我需要一些如何改变颜色的全名,在文本字段中提到发送消息之前Flutter 如何更改TextField小部件中几个单词的颜色?,flutter,Flutter,我试图做聊天提及,我需要一些如何改变颜色的全名,在文本字段中提到发送消息之前 如何操作?如果您只想更改文本字段中文本的颜色或字体: Text("Hello", style: TextStyle(color: Colors.black, fontWeight: FontWeight.w900)) 如果要使用多种样式,应选中,也应选中 RichText小部件显示使用多种不同样式的文本 RichText( text:TextSpan( 文字:“你好”, 样式:TextStyle(颜色:C
如何操作?如果您只想更改文本字段中文本的颜色或字体:
Text("Hello",
style: TextStyle(color: Colors.black, fontWeight: FontWeight.w900))
如果要使用多种样式,应选中,也应选中
RichText小部件显示使用多种不同样式的文本
RichText(
text:TextSpan(
文字:“你好”,
样式:TextStyle(颜色:Colors.black,fontwweight:fontwweight.w900)),
儿童:[
TextSpan(text:'bold',style:TextStyle(fontwweight:fontwweight.bold)),
TextSpan(text:'world!'),
],
),
)
正如杜杜所建议的,您可以使用RichText实现不同颜色的文本。只需要使用TextStyle放置多个不同颜色的TextSpan。样本如下
Container(
margin: const EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 10.0),
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(
children: [
TextSpan(
text: 'By clicking sign up, you have read and agreed to our ',
style: TextStyle(color: Colors.black54),
),
TextSpan(
text: 'Terms & Conditions',
style: TextStyle(color: Colors.blue),
recognizer: TapGestureRecognizer()
..onTap = () {
print('Tapped on hyperlink');
},
),
TextSpan(
text: '.',
style: TextStyle(color: Colors.black54),
),
],
),
),
),
希望这能解决你的问题。希望我还来得及:)
我也有同样的问题,在主颤振软件包或任何第三方软件包中都找不到任何实现,所以我入侵了一个小软件包并上传了它。
它是文本编辑控制器的扩展,可以提供正则表达式模式和相应文本样式的映射
如果有人偶然发现这个问题(像我一样),但需要textfield来呈现可点击的链接,那么这里有一种方法可以做到这一点(从我们的最终实现简化为更好的清晰度)。它的灵感来源于RichTextController,但最终的焦点是允许点击链接 关于正则表达式:我们尝试使用linkify,但尽管尝试了所有选项,它还是倾向于修改链接,这会弄乱用户输入
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:url_launcher/url_launcher.dart';
class LinkedTextEditingController extends TextEditingController {
final RegExp linkRegexp;
final TextStyle linkStyle;
final Function(String match) onTap;
static RegExp _defaultRegExp =
RegExp(r'((?:(https?:\/\/)?)(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,5}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*))', caseSensitive: false, dotAll: true);
static void _defaultOnLaunch(String url) async {
final re = RegExp('^https?://');
final fullUrl = re.hasMatch(url) ? url : 'http://$url';
if (await canLaunch(fullUrl)) {
await launch(fullUrl);
}
}
LinkedTextEditingController({
String text,
RegExp regexp,
this.linkStyle,
this.onTap = _defaultOnLaunch,
}) : linkRegexp = regexp ?? _defaultRegExp,
super(text: text);
LinkedTextEditingController.fromValue(
TextEditingValue value, {
RegExp regexp,
this.linkStyle,
this.onTap = _defaultOnLaunch,
}) : linkRegexp = regexp ?? _defaultRegExp,
assert(
value == null || !value.composing.isValid || value.isComposingRangeValid,
'New TextEditingValue $value has an invalid non-empty composing range '
'${value.composing}. It is recommended to use a valid composing range, '
'even for readonly text fields',
),
super.fromValue(value ?? TextEditingValue.empty);
@override
TextSpan buildTextSpan({TextStyle style, bool withComposing}) {
List<TextSpan> children = [];
text.splitMapJoin(
linkRegexp,
onMatch: (Match match) {
children.add(
TextSpan(
text: match[0],
style: linkStyle,
recognizer: onTap == null ? null : TapGestureRecognizer()
..onTap = () => onTap(match[0]),
),
);
return null;
},
onNonMatch: (String span) {
children.add(TextSpan(text: span, style: style));
return span;
},
);
return TextSpan(style: style, children: children);
}
}
import'package:flatter/signatures.dart';
进口“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
导入“package:url_launcher/url_launcher.dart”;
类LinkedTextEditingController扩展了TextEditingController{
最终RegExp linkRegexp;
最终文本样式链接样式;
最终函数(字符串匹配)onTap;
静态RegExp\u defaultRegExp=
RegExp(r'(((?:(https?:\/\/)(www\)?[-a-zA-Z0-9:%.+~+=]{2256}\.[a-z]{2,5}\b([-a-zA-Z0-9:%.+.~?&/=]),区分大小写:false,dotAll:true);
静态void\u defaultOnLaunch(字符串url)异步{
final re=RegExp(“^https:/”);
final fullUrl=re.hasMatch(url)?url:'http://$url';
如果(等待canLaunch(完整URL)){
等待发射(完整URL);
}
}
LinkedTextEditingController({
字符串文本,
RegExp RegExp,
这是我的风格,
this.onTap=\u defaultOnLaunch,
}):linkRegexp=regexp???\u defaultRegExp,
超级(文本:文本);
LinkedTextEditingController.fromValue(
TextEditingValue值{
RegExp RegExp,
这是我的风格,
this.onTap=\u defaultOnLaunch,
}):linkRegexp=regexp???\u defaultRegExp,
断言(
value==null | |!value.composing.isValid | | value.iscomposinggrangevalid,
'New TextEditingValue$值具有无效的非空组合范围'
“${value.composing}。建议使用有效的组合范围,”
'即使对于只读文本字段',
),
super.fromValue(值??TextEditingValue.empty);
@凌驾
TextSpan buildTextSpan({TextStyle style,bool with composing}){
列出子项=[];
text.splitMapJoin(
linkRegexp,
onMatch:(匹配){
children.add(
TextSpan(
文本:匹配[0],
风格:linkStyle,
识别器:onTap==null?null:TapGestureRecognizer()
…onTap=()=>onTap(匹配[0]),
),
);
返回null;
},
onNonMatch:(字符串跨度){
添加(TextSpan(text:span,style:style));
返回跨度;
},
);
返回TextSpan(样式:样式,子项:子项);
}
}
OP希望为TextField
中的字符串文本提供不同的颜色。感谢您的回答,但我需要更改TextField小部件中而不是文本小部件中的几个单词的颜色。这是关于聊天提到的,当你在文本字段中提到某人时,他的名字应该是另一种颜色。到目前为止,这一功能在Flitter中缺失。只有一个自定义库可用于为textField中的文本定义不同的样式。是的,你说得对@Vicky Salunkhe。经过一些研究,我还发现只有Zefyr,但这不是我需要的。谢谢你的回答@Steve Chan,但我需要在打字时改变不同风格的单词。它应该是类似RichTextEditor的小部件,但目前还没有。谢谢你,干得好!对不起,迟了答复。我接受了你的答案,似乎它会起作用。过去我看起来像这样。很抱歉,我无法测试它,我现在正在进行另一个项目,但我相信这会奏效。)
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:url_launcher/url_launcher.dart';
class LinkedTextEditingController extends TextEditingController {
final RegExp linkRegexp;
final TextStyle linkStyle;
final Function(String match) onTap;
static RegExp _defaultRegExp =
RegExp(r'((?:(https?:\/\/)?)(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,5}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*))', caseSensitive: false, dotAll: true);
static void _defaultOnLaunch(String url) async {
final re = RegExp('^https?://');
final fullUrl = re.hasMatch(url) ? url : 'http://$url';
if (await canLaunch(fullUrl)) {
await launch(fullUrl);
}
}
LinkedTextEditingController({
String text,
RegExp regexp,
this.linkStyle,
this.onTap = _defaultOnLaunch,
}) : linkRegexp = regexp ?? _defaultRegExp,
super(text: text);
LinkedTextEditingController.fromValue(
TextEditingValue value, {
RegExp regexp,
this.linkStyle,
this.onTap = _defaultOnLaunch,
}) : linkRegexp = regexp ?? _defaultRegExp,
assert(
value == null || !value.composing.isValid || value.isComposingRangeValid,
'New TextEditingValue $value has an invalid non-empty composing range '
'${value.composing}. It is recommended to use a valid composing range, '
'even for readonly text fields',
),
super.fromValue(value ?? TextEditingValue.empty);
@override
TextSpan buildTextSpan({TextStyle style, bool withComposing}) {
List<TextSpan> children = [];
text.splitMapJoin(
linkRegexp,
onMatch: (Match match) {
children.add(
TextSpan(
text: match[0],
style: linkStyle,
recognizer: onTap == null ? null : TapGestureRecognizer()
..onTap = () => onTap(match[0]),
),
);
return null;
},
onNonMatch: (String span) {
children.add(TextSpan(text: span, style: style));
return span;
},
);
return TextSpan(style: style, children: children);
}
}