Как установить пользовательское смещение на «FloatingActionButtonLocation» в эшафот, во флаттере? - PullRequest
0 голосов
/ 25 ноября 2018

Итак, недавно был представлен FloatingActionButtonLocation, и он имеет четыре значения для выравнивания по дну.Я хочу это наверху, на полпути ниже панели приложения.Но я не мог понять, как установить собственное смещение.Официальной документации на это тоже мало.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

не используйте встроенный FAB, а скорее стек с вашей собственной круглой кнопкой.внутри тела вашей эшафот вы можете сделать это:

  body: Stack(
    children: <Widget>[

      Container(
        // whatever your main content is
      ),

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

, и тогда MyFAB может быть таким:

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

, и теперь вы можете позиционировать FAB, где вы хотите, используя виджет Positioned вСтек.

0 голосов
/ 25 ноября 2018

Это противоречит рекомендациям по проектированию материалов. Но вы можете сделать это, изменив 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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...