54 lines
1.5 KiB
Dart
54 lines
1.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
// 자동완성 드롭다운에서 텍스트 하이라이트를 위한 위젯
|
|
class HighlightText extends StatelessWidget {
|
|
// 전체 텍스트
|
|
final String text;
|
|
// 하이라이트할 부분
|
|
final String highlight;
|
|
// 하이라이트 색상
|
|
final Color highlightColor;
|
|
// 텍스트 스타일
|
|
final TextStyle? style;
|
|
|
|
const HighlightText({
|
|
Key? key,
|
|
required this.text,
|
|
required this.highlight,
|
|
this.highlightColor = Colors.blue,
|
|
this.style,
|
|
}) : super(key: key);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (highlight.isEmpty) {
|
|
// 하이라이트가 없으면 전체 텍스트 반환
|
|
return Text(text, style: style);
|
|
}
|
|
final String lowerText = text.toLowerCase();
|
|
final String lowerHighlight = highlight.toLowerCase();
|
|
final int start = lowerText.indexOf(lowerHighlight);
|
|
if (start < 0) {
|
|
// 일치하는 부분이 없으면 전체 텍스트 반환
|
|
return Text(text, style: style);
|
|
}
|
|
final int end = start + highlight.length;
|
|
return RichText(
|
|
text: TextSpan(
|
|
style: style ?? DefaultTextStyle.of(context).style,
|
|
children: [
|
|
if (start > 0) TextSpan(text: text.substring(0, start)),
|
|
TextSpan(
|
|
text: text.substring(start, end),
|
|
style: TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
color: highlightColor,
|
|
),
|
|
),
|
|
if (end < text.length) TextSpan(text: text.substring(end)),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|