flutter_integrated_whb/lib/pages/my_appbar.dart

87 lines
2.5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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