BottomAppBar中的槽口用于自定义FAB

时间:2018-08-17 11:28:59

标签: flutter floating-action-button android-bottomappbar

我正在使用unicorndial包中的UnicornDialer在应用程序的主页上创建“素材快速拨号”体验,但是如果我设置shape属性来定义一个缺口, ,则缺口未正确绘制:

enter image description here

我在另一个软件包(flutter_speed_dial)上注意到这被明确提到是行不通的:

  

已将SpeedDial小部件构建为放置在floatActionButton中   脚手架小部件的参数。不能设置它   Scaffold.floatingActionButtonLocation参数的位置   虽然。可以与Scaffold.bottomNavigationBar一起使用,但是   浮动按钮将放置在栏上方,而没有   可能会留出一个缺口。

对于UnicornDialer,由build方法返回的窗口小部件是标准的FloatingActionButton,并且已通过ScaffoldBottomAppBar的代码进行了拖曳无法弄清楚缺口为什么会这样损坏。

我曾尝试使用标准的FAB(但透明)创建槽口,然后将ScaffoldUnicornDialer包裹在Stack中以放置所有东西,但一切正常,但是当您显示SnackBarUnicornDialer不会移动,因此我回到需要BottomAppBar来正确处理自定义FAB进行缺口计算的问题。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要用容器包装UnicornDialer并控制切槽边距, 请注意,notchMargin可以取负值,

bottomAppBar的凹槽的渲染器似乎无法从原始UnicornDialer正确计算Besier曲线。

您可以使用以下代码作为指南。运行良好

import 'package:flutter/material.dart';
import 'package:unicorndial/unicorndial.dart';

void main() =>
    runApp(new MaterialApp(debugShowCheckedModeBanner: false, home: Example()));

class Example extends StatefulWidget {
  _Example createState() => _Example();
}

class _Example extends State<Example> {
  @override
  Widget build(BuildContext context) {
    var childButtons = List<UnicornButton>();

    childButtons.add(UnicornButton(
        hasLabel: true,
        labelText: "Choo choo",
        currentButton: FloatingActionButton(

          heroTag: "train",
          backgroundColor: Colors.redAccent,
          mini: true,
          child: Icon(Icons.train),
          onPressed: () {},
        )));

    childButtons.add(UnicornButton(
        currentButton: FloatingActionButton(
            heroTag: "airplane",
            backgroundColor: Colors.greenAccent,
            mini: true,
            child: Icon(Icons.airplanemode_active))));

    childButtons.add(UnicornButton(
        currentButton: FloatingActionButton(
            heroTag: "directions",
            backgroundColor: Colors.blueAccent,
            mini: true,
            child: Icon(Icons.directions_car))));

    return Scaffold(

      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      bottomNavigationBar: new BottomAppBar(
        shape: CircularNotchedRectangle(),


        notchMargin: -10.0,

        color: Colors.blue,
        child: new Row(
          mainAxisSize: MainAxisSize.max,
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            IconButton(
              icon: Icon(Icons.menu),
              onPressed: () {},
            ),
            IconButton(
              icon: Icon(Icons.search),
              onPressed: () {},
            ),
          ],
        ),
      ),
      //floatingActionButton: FloatingActionButton(onPressed: (){}),
      floatingActionButton: Container(
        width: 100.0,
        height: 100.0,
        child: UnicornDialer(
            hasNotch: true,
            //hasBackground: false,
            backgroundColor: Color.fromRGBO(255, 255, 255, 0.0),
            parentButtonBackground: Colors.redAccent,
            orientation: UnicornOrientation.VERTICAL,
            parentButton: Icon(Icons.add),
            childButtons: childButtons),
      ),
      appBar: AppBar(),
      body: Container(

        child: Center(
          child: RaisedButton(
            onPressed: () {
              setState(() {});
            },
          ),
        ),
      ),
    );
  }
}