README.md를 더 상세하게 작성해드리겠습니다.
# Highlightable Text
텍스트 하이라이트 기능과 메모 기능을 제공하는 Flutter 위젯입니다. 긴 텍스트에서 중요한 부분을 하이라이트하고 메모를 추가할 수 있습니다.
## 주요 기능
- 길게 누르기로 텍스트 하이라이트
- 다양한 하이라이트 색상 지원
- 하이라이트된 텍스트에 메모 추가
- 커스텀 메모 다이얼로그 지원
- 커스텀 메모 표시기 지원
- 스크롤 지원
- 초기 하이라이트 목록 지원
## 설치
pubspec.yaml에 다음을 추가하세요:
```yaml
dependencies:
highlightable_text: ^0.0.1
```
기본 사용법
가장 기본적인 사용 예시:
HighlightableText(
text: "하이라이트 기능을 테스트할 긴 텍스트...",
onSaveNote: (highlight, note) {
print('하이라이트된 텍스트: ${highlight.content}');
print('메모: $note');
},
)
고급 사용법
1. 하이라이트 상태 관리
class MyWidget extends StatefulWidget {
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
final List<Highlight> _highlights = [];
Color _currentColor = Colors.yellow.withOpacity(0.3);
@override
Widget build(BuildContext context) {
return HighlightableText(
text: "긴 텍스트 내용...",
initialHighlights: _highlights,
selectedColor: _currentColor,
onHighlight: (content, start, end) {
print('새로운 하이라이트: $content');
},
onSaveNote: (highlight, note) {
setState(() {
final index = _highlights.indexWhere(
(h) => h.startOffset == highlight.startOffset &&
h.endOffset == highlight.endOffset,
);
if (index != -1) {
_highlights[index] = highlight.copyWith(note: note);
}
});
},
);
}
}
2. 커스텀 메모 다이얼로그
태그 기능이 있는 커스텀 메모 다이얼로그 예시:
HighlightableText(
text: "텍스트 내용...",
noteBuilder: (context, highlight, onSave) {
return CustomNoteDialog(
highlight: highlight,
onSave: onSave,
);
},
)
// 커스텀 다이얼로그 구현
class CustomNoteDialog extends StatefulWidget {
final Highlight highlight;
final OnSaveNoteCallback onSave;
const CustomNoteDialog({
required this.highlight,
required this.onSave,
});
@override
State<CustomNoteDialog> createState() => _CustomNoteDialogState();
}
class _CustomNoteDialogState extends State<CustomNoteDialog> {
late TextEditingController _noteController;
@override
void initState() {
super.initState();
_noteController = TextEditingController(text: widget.highlight.note);
}
@override
Widget build(BuildContext context) {
return AlertDialog(
title: const Text('메모'),
content: TextField(
controller: _noteController,
maxLines: 3,
decoration: const InputDecoration(
hintText: '메모를 입력하세요',
border: OutlineInputBorder(),
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('취소'),
),
TextButton(
onPressed: () => widget.onSave(
widget.highlight,
_noteController.text,
),
child: const Text('저장'),
),
],
);
}
}
3. 커스텀 메모 표시기
HighlightableText(
text: "텍스트 내용...",
noteIndicatorBuilder: (highlight) => Padding(
padding: const EdgeInsets.only(left: 4),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.note,
size: 16,
color: highlight.note?.isNotEmpty == true
? Colors.blue
: Colors.grey[400],
),
if (highlight.note?.isNotEmpty == true) ...[
const SizedBox(width: 4),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 4,
vertical: 2,
),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(4),
),
child: Text(
'메모',
style: TextStyle(fontSize: 10),
),
),
],
],
),
),
)
속성 설명
필수 속성
text
: 표시할 텍스트 내용
선택 속성
textStyle
: 기본 텍스트 스타일highlightColors
: 사용 가능한 하이라이트 색상 목록initialHighlights
: 초기 하이라이트 목록selectedColor
: 현재 선택된 하이라이트 색상selectionOpacity
: 선택 중일 때의 하이라이트 불투명도scrollController
: 스크롤 컨트롤러
콜백
onHighlight
: 새로운 하이라이트 생성 시 호출onHighlightTap
: 하이라이트 탭 시 호출onSaveNote
: 메모 저장 시 호출
커스터마이징
noteBuilder
: 커스텀 메모 다이얼로그 빌더noteIndicatorBuilder
: 커스텀 메모 표시기 빌더
라이선스
MIT License - 자세한 내용은 LICENSE 파일을 참조하세요.
기여하기
버그를 발견하셨거나 새로운 기능을 제안하고 싶으시다면 이슈를 생성해주세요.
FAQ
Q: 하이라이트 색상을 동적으로 변경하려면 어떻게 해야 하나요?
Color _currentColor = Colors.yellow.withOpacity(0.3);
HighlightableText(
text: "텍스트 내용...",
selectedColor: _currentColor,
)
Q: 하이라이트된 텍스트의 위치로 스크롤하려면 어떻게 해야 하나요?
final scrollController = ScrollController();
HighlightableText(
text: "텍스트 내용...",
scrollController: scrollController,
)
// 스크롤 위치 이동
scrollController.animateTo(
position,
duration: Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
## 추가 예시
더 많은 예시는 `example` 폴더를 참조하세요.
## 버전 요구사항
- Flutter: >=3.0.0
- Dart: >=3.0.0
- 모든 플랫폼 지원 (iOS, Android, Web, Desktop)
이렇게 하면 사용자들이 라이브러리의 기능을 더 쉽게 이해하고 활용할 수 있을 것 같습니다. README에 더 추가하고 싶은 내용이 있다면 말씀해 주세요!