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);
  }
}