2025-07-11 11:03:21 +08:00
|
|
|
|
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,
|
2025-07-16 08:37:08 +08:00
|
|
|
|
this.backgroundColor = const Color(0xFF3874F6),
|
2025-07-11 11:03:21 +08:00
|
|
|
|
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!,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|