إنشاء عروض الأشجار التفاعلية باستخدام fancy_tree_view في Flutter
تُبسط مكتبة flutter_fancy_tree_view إنشاء عروض الأشجار التفاعلية (المعروفة أيضًا باسم واجهات المستخدم الهيكلية) داخل تطبيقات Flutter الخاصة بك.
الميزات الرئيسية:
تمثيل العقدة: يتم تمثيل كل عنصر في الشجرة بكائن FancyTreeNode. يمكنك تخصيص مظهر العقدة باستخدام خصائص مثل:
- title: النص المعروض للعقدة.
- leadingWidget: عنصر واجهة مستخدم يتم عرضه في بداية العقدة (غالبًا ما يكون رمزًا).
- trailingWidget: عنصر واجهة مستخدم يتم عرضه في نهاية العقدة (غالبًا ما يستخدم لوظيفة التوسيع / الانهيار).
- children: قائمة بالعقد الفرعية، مما يشكل التسلسل الهرمي.
- سلوك التوسيع / الانهيار: يمكن توسيع العقد أو انهيارها لكشف أو إخفاء أطفالها. استخدم خاصية expanded لـ FancyTreeNode للتحكم في حالتها الأولية وتوفير آليات للتفاعل مع المستخدم (على سبيل المثال، إيماءات النقر).
- التخصيص: خيّط مظهر ووظائف عرض الشجرة من خلال خصائص مثل:
- theme: كائن سمة مخصص يحدد الألوان والخطوط وغيرها من الجوانب المرئية.
- showExpansionButtons: تحكم في عرض أزرار توسيع / انهيار العقد.
- collapseIcon: الرمز المعروض للعقد المنهارة.
- expandIcon: الرمز المعروض للعقد المتوسعة.
- الاختيار: اسمح للمستخدمين باختيار العقد باستخدام خاصية selectedNodes لـ FancyTreeView widget. تعامل مع أحداث الاختيار بشكل فعال لتوفير الإجراءات أو التعليقات ذات الصلة.
التثبيت:
أضف السطر التالي إلى ملف pubspec.yaml الخاص بك:
flutter_fancy_tree_view: ^1.5.0
الاستيراد:
استيراد المكتبة في كود Dart الخاص بك:
import 'package:flutter_fancy_tree_view/flutter_fancy_tree_view.dart';
الاستخدام الأساسي:
قم بإنشاء عنصر واجهة مستخدم FancyTreeView وقم بتوفير قائمة من كائنات FancyTreeNode تمثل بنية الشجرة الخاصة بك:
index.dart
List<FancyTreeNode> _treeNodes = [
FancyTreeNode(
title: 'العقدة الجذرية',
children: [
FancyTreeNode(title: 'العقدة الفرعية 1'),
FancyTreeNode(
title: 'العقدة الفرعية 2',
children: [
FancyTreeNode(title: 'العقدة الفرعية'),
],
),
],
),
];
FancyTreeView(
nodes: _treeNodes,
);مثال (مستكشف نظام الملفات):
import 'package:flutter/material.dart';
import 'package:flutter_fancy_tree_view/flutter_fancy_tree_view.dart';
class FileNode {
final String name;
final bool isDirectory;
final List<FileNode> children;
FileNode(this.name, [this.isDirectory = false, this.children = const []]);
}
class FileSystemExplorer extends StatelessWidget {
final TreeController<FileNode> controller = TreeController<FileNode>(
roots: [
FileNode(
'الصفحة الرئيسية',
true,
[
FileNode('المستندات'),
FileNode(
'الصور',
true,
[
FileNode('Image1.jpg'),
FileNode('Image2.png'),
],
),
],
),
],
childrenProvider: (node) => node.children,
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('مستعرض الملفات')),
body: FancyTreeView<FileNode>(
treeController: controller,
builder: (context, node) {
return ListTile(
leading: Icon(
node.isDirectory ? Icons.folder : Icons.insert_drive_file,
color: node.isDirectory ? Colors.orange : Colors.grey,
),
title: Text(node.name),
);
},
theme: FancyTreeTheme(
expansionIndicator: Icon(Icons.arrow_drop_down),
collapseIndicator: Icon(Icons.arrow_right),
connectorLineColor: Colors.grey.shade300,
verticalSpacing: 4,
),
),
);
}
}