Files
smartgarden_chat/lib/main.dart
2026-06-15 18:12:31 +09:00

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));
}
}
}