Flutter 如何将自定义偏移设置为";浮动操作按钮定位“;在断头台上,在颤栗?

Flutter 如何将自定义偏移设置为";浮动操作按钮定位“;在断头台上,在颤栗?,flutter,Flutter,所以最近引入了FloatingActionButtonLocation,它有四个值,所有值都用于底部对齐。我希望它在顶部,在应用程序栏的一半以下。但我不知道如何设置自定义偏移量。这方面的官方文档也很少。这违反了材料设计指南。但您可以通过将原始源代码中的scaffoldGeometry.contentBottom更改为scaffoldGeometry.contentTop来实现。下面的代码应该可以工作 import 'package:flutter/material.dart'; import '

所以最近引入了FloatingActionButtonLocation,它有四个值,所有值都用于底部对齐。我希望它在顶部,在应用程序栏的一半以下。但我不知道如何设置自定义偏移量。这方面的官方文档也很少。

这违反了材料设计指南。但您可以通过将原始源代码中的
scaffoldGeometry.contentBottom
更改为
scaffoldGeometry.contentTop
来实现。下面的代码应该可以工作

import 'package:flutter/material.dart';
import 'dart:math' as math;


class HomeHeader extends StatefulWidget {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  @override
  HomeHeaderState createState() {
    return new HomeHeaderState();
  }
}

class HomeHeaderState extends State<HomeHeader> {

  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);
  }
}
导入“包装:颤振/材料.省道”;
导入'dart:math'作为数学;
类HomeHeader扩展了StatefulWidget{
最终GlobalKey _scaffoldKey=新的GlobalKey();
@凌驾
HomeHeaderState createState(){
返回新的HomeHeaderState();
}
}
类HomeHeaderState扩展状态{
静态常量FloatingActionButtonLocation centerDocked=\u CenterDockedFloatingActionButtonLocation();
@凌驾
小部件构建(构建上下文){
归还新脚手架(
钥匙:小部件。_scaffoldKey,
appBar:appBar(
标题:文本(“duh”),
),
浮动操作按钮位置:中心停靠,
浮动操作按钮:浮动操作按钮(
子:常量图标(Icons.add),按下时:(){
},),
正文:新容器()
);
}
}
类_CenterDockedFloatingActionButtonLocation扩展了_DockedFloatingActionButtonLocation{
const_CenterDockedFloatingActionButtonLocation();
@凌驾
偏移量getOffset(脚手架LDPrelayoutGeometry脚手架几何){
最终双fabX=(scaffoldGeometry.scaffoldSize.width-scaffoldGeometry.floatingActionButtonSize.width)/2.0;
返回偏移量(fabX,getDockedY(脚手架几何));
}
}
抽象类DockedFloatingActionButtonLocation扩展了FloatingActionButtonLocation{
const_dockdfloatingActionButtonLocation();
@保护
double getDockedY(ScaffoldPrelayoutGeometry scaffoldGeometry){
最终双contentBottom=scaffoldGeometry.contentTop;
最终双appBarHeight=脚手架几何体.bottomSheetSize.height;
最终双fabHeight=脚手架几何体.floatingActionButtonSize.height;
最终双snackBarHeight=脚手架几何体.snackBarSize.height;
双fabY=contentBottom-fabHeight/2.0;
如果(蛇形杆高度>0.0)
fabY=math.min(fabY,contentBottom-snackBarHeight-fabHeight-kFloatingActionButtonMargin);
如果(appBarHeight>0.0)
fabY=math.min(fabY,contentBottom-appBarHeight-fabHeight/2.0);
最终double maxFabY=脚手架几何体.scaffoldSize.height-脚手架高度;
返回math.min(maxFabY,fabY);
}
}

不要使用内置的FAB,而是使用带有自己的圆形按钮的堆栈。在脚手架体内,您可以执行以下操作:

  body: Stack(
    children: <Widget>[

      Container(
        // whatever your main content is
      ),

      Positioned(
        top: 5.0,
        right: 200.0, // or whatever
        child: MyFAB,
      ),
    ],
  ),

现在,您可以使用堆栈中的定位小部件将晶圆厂定位到您想要的任何位置。

谢谢,这对我很有用!然而,做得不那么复杂,把晶圆厂的25%和75%的宽度。
class MyFAB extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Container(

      color: Colors.blue,
      child: InkWell(
        onTap: () => {},
        borderRadius: BorderRadius.circular(50.0),
        child: Container(
          width: 45.0,
          height: 45.0,
          decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: Colors.red,
          ),
          child: Icon(
            Icons.add,
            color: Colors.yellow,
            size: 25.0,
          ),
        ),
      ),
    );
  }
}