선택된 목적지와 중첩 rail을 표시하는 타입 기반 확장 탐색을 구성해요.
핵심 속성
| 선택 상태 | 로컬 선택에는 defaultValue를 사용하고, 부모가 선택을 관리하려면 value, onValueChange와 함께 TRTreeNav.controlled를 사용해요. |
| 확장 상태 | initiallyExpanded는 그룹의 초기 상태를 정하고, TRTreeNavController는 현재 펼친 집합을 읽거나 바꿔요. |
| 중첩과 rail | 중첩 단계마다 guide rail과 들여쓰기가 추가되고, 선택한 leaf를 포함한 그룹은 활성 강조를 사용해요. |
| 상태 유지 | pageStorageId는 가장 가까운 PageStorage에서 펼친 그룹을 복원하며 선택 상태의 관리 방식은 바꾸지 않아요. |
| 콘텐츠 | description은 옅은 보조 줄을 추가해요. leading과 trailing은 전체 행 주위에서 정렬을 유지해요. 그룹의 trailing은 chevron을 대체하고, leaf는 trailing 콘텐츠 뒤에 disclosure indicator를 선택적으로 표시할 수 있어요. |
| 크기 | uiSize를 생략하면 TRUiDensityScope를 따라요. 모든 크기는 콘텐츠 위아래에 8 logical px를 사용해요. standard density는 한 줄 leaf의 최소 높이 40px를 유지하고, description이 있으면 콘텐츠에 맞춰 행이 커져요. |
순서가 있는 컬렉션에는 TRTreeNav를 사용하고, 단독 목적지에는 TRNavigationRow를 사용해요. Tab은 읽기 순서를 따라요. Enter와 Space는 포커스된 행을 실행하고, 위·아래 화살표는 트리 행 사이를 이동하며, 펼침·접힘 화살표는 텍스트 방향을 따라요. 활성 행은 포인터에 hover와 pressed 표면으로 반응해요. 비활성 행은 건너뛰고 포인터와 키보드 입력을 무시해요.
설치
패키지를 추가한 뒤 공개 라이브러리를 가져오세요.
flutter pub add tinyrack_ui
import 'package:tinyrack_ui/tinyrack_ui.dart';
플레이그라운드
사용법
import 'package:material_ui/material_ui.dart';
import 'package:tinyrack_ui/tinyrack_ui.dart';
class DocsTree extends StatefulWidget {
const DocsTree({super.key});
@override
State<DocsTree> createState() => _DocsTreeState();
}
class _DocsTreeState extends State<DocsTree> {
String? currentPage = 'theming';
@override
Widget build(BuildContext context) => TRTreeNav<String>.controlled(
value: currentPage,
onValueChange: (value) => setState(() => currentPage = value),
pageStorageId: 'docs-navigation',
semanticLabel: 'Documentation',
items: const [
TRTreeNavGroup(
value: 'guides',
label: Text('GUIDES'),
description: Text('Product documentation'),
initiallyExpanded: true,
children: [
TRTreeNavLeaf(
value: 'install',
label: Text('Install'),
description: Text('Add and configure the package'),
),
TRTreeNavGroup(
value: 'advanced',
label: Text('ADVANCED'),
initiallyExpanded: true,
children: [
TRTreeNavLeaf(value: 'plugins', label: Text('Plugins')),
TRTreeNavLeaf(value: 'theming', label: Text('Theming')),
],
),
],
),
],
);
}
예시
API
TRNavigationRow 속성
label, description | Widget, Widget? · label required | 기본 label과 선택적인 옅은 보조 줄을 렌더링해요. |
leading, trailing | Widget?, Widget? · null | label 앞뒤에 콘텐츠를 추가해요. 자동 disclosure indicator는 trailing 콘텐츠 뒤에 표시돼요. |
selected, enabled | bool, bool · false, true | 선택 강조와 행을 실행할 수 있는지 제어해요. |
onPressed | VoidCallback? · null | 목적지를 실행해요. callback이 없는 행은 실행할 수 없으며 indicator를 표시하지 않아요. |
uiSize | TRUiSize? · density default | TRUiDensityScope가 제공하는 행과 콘텐츠 크기를 덮어써요. |
TRTreeNav 속성
items | List<TRTreeNavItem<T>> · required | 순서가 있는 그룹과 목적지를 정의해요. |
value, defaultValue | T?, T? · null | 선택을 제어하거나 비제어 선택의 초기값을 정해요. |
onValueChange | ValueChanged<T?>? · null | 활성화된 leaf를 실행하면 값을 전달해요. |
controller | TRTreeNavController<T>? · null | 선택을 관찰하고 펼친 그룹 집합을 관리해요. |
pageStorageId, semanticLabel | Object?, String? · null | 펼침 상태를 유지하고 보조 기술에 탐색 영역 이름을 제공해요. |
uiSize | TRUiSize? · density default | TRUiDensityScope가 제공하는 행과 콘텐츠 크기를 덮어써요. |
TRTreeNavGroup 속성
value, label, children | T, Widget, List<TRTreeNavItem<T>> · required | 그룹을 식별하고 trigger와 중첩 node를 정의해요. |
initiallyExpanded | bool · false | 그룹을 초기 펼침 집합에 추가해요. |
key | Key? · null | 상태 복원과 정확한 상호작용을 위해 렌더링된 그룹 행을 식별해요. |
description | Widget? · null | 그룹 label 아래에 옅은 보조 줄을 추가해요. |
disabled, leading, trailing | bool?, Widget?, Widget? · null | 확장을 막거나 행을 꾸며요. trailing은 chevron을 대체해요. |
TRTreeNavLeaf 속성
value, label | T, Widget · required | 선택할 수 있는 목적지를 식별하고 렌더링해요. |
description | Widget? · null | 목적지 label 아래에 옅은 보조 줄을 추가해요. |
key | Key? · null | label이 반복되어도 렌더링된 목적지 행을 식별해요. |
disabled, leading, trailing | bool?, Widget?, Widget? · null | 선택을 막거나 label 앞뒤에 콘텐츠를 추가해요. |
showDisclosureIndicator | bool · false | 활성 목적지의 trailing 콘텐츠 뒤에 텍스트 방향을 따르는 indicator를 표시해요. |
TRTreeNavController API
value, expanded | T?, Set<T> | 현재 선택과 수정할 수 없는 펼침 집합을 읽어요. |
select, toggle | void Function(T?), void Function(T) | 선택을 바꾸거나 한 그룹의 펼침 상태를 반전해요. |
setExpanded, replaceExpanded | methods | 그룹 하나를 설정하거나 전체 펼침 집합을 교체해요. |