first commit
This commit is contained in:
109
lib/main.dart
Normal file
109
lib/main.dart
Normal file
@@ -0,0 +1,109 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user