From 1132b78ecd98ed06a6d3d389c7c9f382491e1953 Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Sun, 16 Nov 2025 22:10:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E5=BA=95=E9=83=A8?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/layout/menu.dart | 5 +++++ lib/layout/nav_bar.dart | 22 ++++++++++++++++++++++ lib/pages/home_page.dart | 22 ++++++++++++++++++++++ lib/widget/blog.dart | 27 +++++++++------------------ lib/widget/search.dart | 1 - 5 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 lib/layout/nav_bar.dart diff --git a/lib/layout/menu.dart b/lib/layout/menu.dart index e89b548..8f8aed6 100644 --- a/lib/layout/menu.dart +++ b/lib/layout/menu.dart @@ -20,3 +20,8 @@ final List pages = [ ]; final List pageWidgets = pages.map((item) => item.page).toList(); + +final List bottomNavItems = + pages.map((page) { + return BottomNavigationBarItem(icon: Icon(page.icon), label: page.title); + }).toList(); diff --git a/lib/layout/nav_bar.dart b/lib/layout/nav_bar.dart new file mode 100644 index 0000000..08584cc --- /dev/null +++ b/lib/layout/nav_bar.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +import 'menu.dart'; + +Widget buildBottomNavigationBar({ + required BuildContext context, + required int index, + required Function(int) onTap, +}) { + return BottomNavigationBar( + currentIndex: index, + onTap: onTap, + items: bottomNavItems, + type: BottomNavigationBarType.fixed, + selectedItemColor: Theme.of(context).colorScheme.primary, + unselectedItemColor: Colors.grey, + showSelectedLabels: true, + showUnselectedLabels: true, + backgroundColor: Colors.white, + elevation: 8, + ); +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index d1a68eb..49f4b34 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,11 +1,14 @@ import 'package:blog_app/apis/blog.dart'; import 'package:blog_app/layout/drawer.dart'; import 'package:blog_app/layout/menu.dart'; +import 'package:blog_app/layout/nav_bar.dart'; import 'package:blog_app/models/blog.dart'; import 'package:blog_app/widget/search.dart'; import 'package:flutter/material.dart'; class HomePage extends StatefulWidget { + const HomePage({super.key}); + @override _HomePageState createState() => _HomePageState(); } @@ -162,6 +165,20 @@ class _HomePageState extends State { return buildSearchResultList(context, _searchResults); } + void _onBottomNavTap(int index) { + setState(() { + _currentPageIndex = index; + if (_isSearching) { + _exitSearch(); + } + }); + _pageController.animateToPage( + index, + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + } + void onTapDrawerItem(int index) { setState(() { _currentPageIndex = index; @@ -220,6 +237,11 @@ class _HomePageState extends State { ), drawer: _buildDrawer(), body: Padding(padding: EdgeInsets.all(10), child: _buildPageView()), + bottomNavigationBar: buildBottomNavigationBar( + context: context, + index: _currentPageIndex, + onTap: _onBottomNavTap, + ), ); } } diff --git a/lib/widget/blog.dart b/lib/widget/blog.dart index 8286d33..ac8218c 100644 --- a/lib/widget/blog.dart +++ b/lib/widget/blog.dart @@ -228,27 +228,18 @@ Widget buildBlogListItem(BuildContext context, Blog blog, int index) { padding: EdgeInsets.all(10), child: Row( children: [ - SizedBox( - width: 25, - child: Text( - index.toString(), - style: TextStyle( - fontWeight: FontWeight.w500, - color: colors.primary, - ), + Text( + '$index.', + style: TextStyle( + fontWeight: FontWeight.w500 ), ), - - // 发布时间 - SizedBox( - width: 150, - child: Text( - blog.createTime, - style: TextStyle(fontSize: 14, color: Colors.grey.shade600), - ), + SizedBox(width: 10), + Text( + formatDateString(blog.createTime), + style: TextStyle(fontSize: 14, color: Colors.grey.shade600), ), - - // 标题 + SizedBox(width: 10), Expanded( child: Text( blog.title, diff --git a/lib/widget/search.dart b/lib/widget/search.dart index 7a2a642..3138159 100644 --- a/lib/widget/search.dart +++ b/lib/widget/search.dart @@ -1,5 +1,4 @@ import 'package:blog_app/models/blog.dart'; -import 'package:blog_app/pages/blog_detail_page.dart'; import 'package:blog_app/widget/blog.dart'; import 'package:blog_app/widget/common.dart'; import 'package:flutter/material.dart';