📅  最后修改于: 2022-03-11 14:48:09.388000             🧑  作者: Mango
import 'package:flutter/material.dart';
import 'dart:math' as math;
class HomeHeader extends StatefulWidget {
final GlobalKey _scaffoldKey = new GlobalKey();
@override
HomeHeaderState createState() {
return new HomeHeaderState();
}
}
class HomeHeaderState extends State {
static const FloatingActionButtonLocation centerDocked = _CenterDockedFloatingActionButtonLocation();
@override
Widget build(BuildContext context) {
return new Scaffold(
key: widget._scaffoldKey,
appBar: AppBar(
title: Text('duh'),
),
floatingActionButtonLocation:centerDocked,
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add), onPressed: () {
},),
body: new Container()
);
}
}
class _CenterDockedFloatingActionButtonLocation extends _DockedFloatingActionButtonLocation {
const _CenterDockedFloatingActionButtonLocation();
@override
Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
final double fabX = (scaffoldGeometry.scaffoldSize.width - scaffoldGeometry.floatingActionButtonSize.width) / 2.0;
return Offset(fabX, getDockedY(scaffoldGeometry));
}
}
abstract class _DockedFloatingActionButtonLocation extends FloatingActionButtonLocation {
const _DockedFloatingActionButtonLocation();
@protected
double getDockedY(ScaffoldPrelayoutGeometry scaffoldGeometry) {
final double contentBottom = scaffoldGeometry.contentTop;
final double appBarHeight = scaffoldGeometry.bottomSheetSize.height;
final double fabHeight = scaffoldGeometry.floatingActionButtonSize.height;
final double snackBarHeight = scaffoldGeometry.snackBarSize.height;
double fabY = contentBottom - fabHeight / 2.0;
if (snackBarHeight > 0.0)
fabY = math.min(fabY, contentBottom - snackBarHeight - fabHeight - kFloatingActionButtonMargin);
if (appBarHeight > 0.0)
fabY = math.min(fabY, contentBottom - appBarHeight - fabHeight / 2.0);
final double maxFabY = scaffoldGeometry.scaffoldSize.height - fabHeight;
return math.min(maxFabY, fabY);
}
}