import 'package:flutter/material.dart'; import 'package:my_portfolio/constants/colors.dart'; import 'package:my_portfolio/constants/size.dart'; import 'package:my_portfolio/constants/sns_links.dart'; import 'package:my_portfolio/widgets/contact_section.dart'; import 'package:my_portfolio/widgets/drawer_mobile.dart'; import 'package:my_portfolio/widgets/footer_section.dart'; import 'package:my_portfolio/widgets/header_desktop.dart'; import 'package:my_portfolio/widgets/header_mobile.dart'; import 'package:my_portfolio/widgets/main_desktop.dart'; import 'package:my_portfolio/widgets/main_mobile.dart'; import 'package:my_portfolio/widgets/project_section.dart'; import 'package:my_portfolio/widgets/skills_section.dart'; import 'dart:js' as js; class HomePage extends StatefulWidget { const HomePage({super.key}); @override State createState() => _HomePageState(); } class _HomePageState extends State { final scaffoldKey = GlobalKey(); final scrollController = ScrollController(); final List navbarKeys = List.generate(4, (index) => GlobalKey()); @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, constraints) { return Scaffold( key: scaffoldKey, backgroundColor: CustomColor.scaffoldBg, endDrawer: constraints.maxWidth >= kMinDesktopWidth ? null : DrawerMobile( onNavItemTap: (int navIndex) { scaffoldKey.currentState?.closeEndDrawer(); scrollToAction(navIndex); }, ), body: SingleChildScrollView( controller: scrollController, scrollDirection: Axis.vertical, child: Column( children: [ SizedBox(key: navbarKeys.first), // MAIN if (constraints.maxWidth >= kMinDesktopWidth) HeaderDesktop( navMenuTap: (int navIndex) { //call function scrollToAction(navIndex); }, ) else HeaderMobile( onLogoTap: () {}, onMenuTap: () { scaffoldKey.currentState?.openEndDrawer(); }, ), if (constraints.maxWidth >= kMinDesktopWidth) const MainDesktop() else const MainMobile(), // SKILLS SkillsSection(key: navbarKeys[1]), const SizedBox(height: 30), // PROJECTS ProjectSection(key: navbarKeys[2]), const SizedBox(height: 30), // CONTACT ContactSection(key: navbarKeys[3]), const SizedBox(height: 30), // FOOTER const FooterSection(), ], ), ), ); }, ); } void scrollToAction(int navIndex) { if (navIndex == 4) { // open a blog page js.context.callMethod("open", [SnsLinks.blog]); return; } final key = navbarKeys[navIndex]; Scrollable.ensureVisible( key.currentContext!, duration: const Duration(milliseconds: 500), curve: Curves.easeInOut, ); } }