87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Dart
		
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Dart
		
	
	
| import 'package:flutter/material.dart';
 | ||
| import 'dart:io' show Platform;
 | ||
| 
 | ||
| class MyAppbar extends StatelessWidget implements PreferredSizeWidget {
 | ||
|   final String title;
 | ||
|   final VoidCallback? onBackPressed;
 | ||
|   final Color backgroundColor;
 | ||
|   final Color textColor;
 | ||
|   final List<Widget>? actions;
 | ||
|   final bool isBack;
 | ||
|   final bool centerTitle; // 新增:控制标题是否居中
 | ||
| 
 | ||
|   const MyAppbar({
 | ||
|     Key? key,
 | ||
|     required this.title,
 | ||
|     this.onBackPressed,
 | ||
|     this.backgroundColor = const Color(0xFF3874F6),
 | ||
|     this.textColor = Colors.white,
 | ||
|     this.actions,
 | ||
|     this.isBack = true,
 | ||
|     this.centerTitle = true, // 默认居中
 | ||
|   }) : super(key: key);
 | ||
| 
 | ||
|   // 根据平台设置不同高度
 | ||
|   @override
 | ||
|   Size get preferredSize {
 | ||
|     // iOS使用更紧凑的高度(44点),Android保持默认(56点)
 | ||
|     return Size.fromHeight(Platform.isIOS ? 44.0 : kToolbarHeight);
 | ||
|   }
 | ||
| 
 | ||
|   @override
 | ||
|   Widget build(BuildContext context) {
 | ||
|     return AppBar(
 | ||
|       backgroundColor: backgroundColor,
 | ||
|       automaticallyImplyLeading: false,
 | ||
|       centerTitle: centerTitle,
 | ||
|       toolbarHeight: preferredSize.height, // 使用计算的高度
 | ||
|       title: Text(
 | ||
|         title,
 | ||
|         style: TextStyle(
 | ||
|           color: textColor,
 | ||
|           fontSize: Platform.isIOS ? 17.0 : 18.0, // iOS使用更小字号
 | ||
|           fontWeight: FontWeight.w600, // iOS使用中等字重
 | ||
|         ),
 | ||
|       ),
 | ||
|       leading: isBack ? _buildBackButton(context) : null,
 | ||
|       actions: _buildActions(),
 | ||
|       elevation: Platform.isIOS ? 0 : 4, // iOS无阴影
 | ||
|       // iOS添加底部边框
 | ||
|       shape: Platform.isIOS
 | ||
|           ? const Border(bottom: BorderSide(color: Colors.black12, width: 0.5))
 | ||
|           : null,
 | ||
|     );
 | ||
|   }
 | ||
| 
 | ||
|   // 返回按钮
 | ||
|   Widget _buildBackButton(BuildContext context) {
 | ||
|     return Padding(
 | ||
|       padding: EdgeInsets.only(left: Platform.isIOS ? 8.0 : 16.0),
 | ||
|       child: IconButton(
 | ||
|         icon: Icon(
 | ||
|           Platform.isIOS ? Icons.arrow_back_ios : Icons.arrow_back,
 | ||
|           color: textColor,
 | ||
|           size: Platform.isIOS ? 20.0 : 24.0, // iOS使用更小图标
 | ||
|         ),
 | ||
|         padding: EdgeInsets.zero, // 移除默认内边距
 | ||
|         constraints: const BoxConstraints(), // 移除默认约束
 | ||
|         onPressed: onBackPressed ?? () => Navigator.of(context).pop(),
 | ||
|       ),
 | ||
|     );
 | ||
|   }
 | ||
| 
 | ||
|   // 右侧按钮间距
 | ||
|   List<Widget>? _buildActions() {
 | ||
|     if (actions == null) return null;
 | ||
| 
 | ||
|     return [
 | ||
|       Padding(
 | ||
|         padding: EdgeInsets.only(right: Platform.isIOS ? 8.0 : 16.0),
 | ||
|         child: Row(
 | ||
|           mainAxisSize: MainAxisSize.min,
 | ||
|           children: actions!,
 | ||
|         ),
 | ||
|       )
 | ||
|     ];
 | ||
|   }
 | ||
| } |