flutter_integrated_whb/lib/pages/my_appbar.dart

87 lines
2.5 KiB
Dart
Raw Permalink Normal View History

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!,
),
)
];
}
}