109 lines
3.8 KiB
Dart
109 lines
3.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:smartgarden_chat/widgets/sidebar.dart';
|
|
import 'package:smartgarden_chat/widgets/header.dart';
|
|
import 'package:smartgarden_chat/widgets/main_dashboard.dart';
|
|
|
|
import 'package:smartgarden_chat/widgets/temp_data_page.dart';
|
|
import 'package:smartgarden_chat/widgets/humid_data_page.dart';
|
|
import 'package:smartgarden_chat/widgets/co2_data_page.dart';
|
|
import 'package:smartgarden_chat/widgets/tvoc_data_page.dart';
|
|
import 'package:smartgarden_chat/widgets/dust_data_page.dart';
|
|
import 'package:smartgarden_chat/widgets/device_manage_page.dart';
|
|
|
|
import 'package:smartgarden_chat/widgets/chatbot_detail_page.dart';
|
|
|
|
void main() => runApp(const SmartGardenApp());
|
|
|
|
class SmartGardenApp extends StatelessWidget {
|
|
const SmartGardenApp({super.key});
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
debugShowCheckedModeBanner: false,
|
|
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: const Color(0xFF0F1115)),
|
|
home: const MainDashboardScreen(),
|
|
);
|
|
}
|
|
}
|
|
|
|
class MainDashboardScreen extends StatefulWidget {
|
|
const MainDashboardScreen({super.key});
|
|
@override
|
|
State<MainDashboardScreen> createState() => _MainDashboardScreenState();
|
|
}
|
|
|
|
class _MainDashboardScreenState extends State<MainDashboardScreen> {
|
|
// ✨ 초기값을 false로 설정하여 앱 시작 시 사이드바가 숨겨진 상태로 만듭니다.
|
|
bool isSidebarOpen = false;
|
|
String selectedPage = '스마트가든 챗봇';
|
|
bool isChatbotDetail = false;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: Row(
|
|
children: [
|
|
AnimatedContainer(
|
|
duration: const Duration(milliseconds: 250),
|
|
curve: Curves.easeInOut,
|
|
width: isSidebarOpen ? 260 : 0,
|
|
child: Sidebar(
|
|
isSidebarOpen: isSidebarOpen,
|
|
selectedPage: selectedPage,
|
|
onPageChanged: (page) {
|
|
setState(() {
|
|
selectedPage = page;
|
|
isChatbotDetail = false; // 다른 메뉴 클릭 시 상세 뷰 초기화
|
|
});
|
|
},
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Column(
|
|
children: [
|
|
Header(
|
|
title: isChatbotDetail ? '$selectedPage - 상세' : selectedPage,
|
|
isSidebarOpen: isSidebarOpen,
|
|
onToggleSidebar: () => setState(() => isSidebarOpen = !isSidebarOpen),
|
|
),
|
|
Expanded(
|
|
child: Container(
|
|
padding: const EdgeInsets.all(24.0),
|
|
color: const Color(0xFF13161A),
|
|
child: _buildBody(), // ✨ 개인 위젯 호출 통로
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
// ✨ 질문자님이 정의하신 아코디언 메뉴명과 개인 위젯 매핑 분기점
|
|
Widget _buildBody() {
|
|
switch (selectedPage) {
|
|
case '스마트가든 챗봇':
|
|
return isChatbotDetail
|
|
? ChatbotDetailPage(onBack: () => setState(() => isChatbotDetail = false))
|
|
: DashboardGrid(onCharacterTap: () => setState(() => isChatbotDetail = true));
|
|
case '온도 데이터':
|
|
return const TempDataPage();
|
|
case '습도 데이터':
|
|
return const HumidDataPage();
|
|
case '이산화탄소 데이터':
|
|
return const Co2DataPage();
|
|
case 'TVOC 데이터':
|
|
return const TvocDataPage();
|
|
case '미세먼지 데이터':
|
|
return const DustDataPage();
|
|
case '장비 관리':
|
|
return const DeviceManagePage();
|
|
default:
|
|
return isChatbotDetail
|
|
? ChatbotDetailPage(onBack: () => setState(() => isChatbotDetail = false))
|
|
: DashboardGrid(onCharacterTap: () => setState(() => isChatbotDetail = true));
|
|
}
|
|
}
|
|
} |