如何将抽屉连接到颤动的动画图标按钮?

Posted

技术标签:

【中文标题】如何将抽屉连接到颤动的动画图标按钮?【英文标题】:How to connect drawer to animated icon button in flutter? 【发布时间】:2020-06-11 19:13:59 【问题描述】:

我想在AppBar 上设置动画按钮图标(始终可见),以便在我的应用程序中调用抽屉。为了让 AppBar 在 Drawer 打开时始终可见,我使用了这种方法:我必须将 AppBar 放在主 Scaffold 上,然后传递一个子项:Scaffold 并将 Drawer 放在里面。

我设法让按钮通过 IF 语句和 _scaffoldKey.currentState 工作。因此,在打开和关闭抽屉时,按钮可以工作并从汉堡包到箭头的动画,但我也想在通过滑动打开/关闭抽屉时或在打开抽屉时通过点击外部抽屉来实现按钮的动画。有什么办法吗?

我是 Flutter 的初学者,这是我的代码的一部分:

class HomePage extends StatefulWidget 
  @override _HomePageState createState() => _HomePageState();


class _HomePageState extends State<HomePage>
    with SingleTickerProviderStateMixin 
  AnimationController _animationController;
  bool isPlaying = false;
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  bool _isDrawerOpen = false;

  @override
  void initState() 
    super.initState();
    _animationController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 300));
  



  @override
  void dispose() 
    super.dispose();
    _animationController.dispose();
  

  void _handleOnPressed() 
    setState(() 
      isPlaying = !isPlaying;
      isPlaying
          ? _animationController.forward()
          : _animationController.reverse();
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      primary: true,
      appBar: AppBar(
        automaticallyImplyLeading: false,
        title: Text(
          "Drawer animation",
          style: TextStyle(
              fontSize: 40,
              fontStyle: FontStyle.italic,
              fontWeight: FontWeight.w600,
              color: Colors.black45),
        ),
        centerTitle: true,
        backgroundColor: Colors.amber,
        leading: IconButton(
          icon: AnimatedIcon(
              icon: AnimatedIcons.menu_arrow, progress: _animationController),
          onPressed: () 
            if (!_isDrawerOpen) 
              _scaffoldKey.currentState.openDrawer();
             else 
              Navigator.pop(context);
            
            setState(() 
              _isDrawerOpen = !_isDrawerOpen;
            );
            _handleOnPressed();
          ,
        ),
      ),

      body: Scaffold(
        key: _scaffoldKey,
        drawer: Drawer(
                child: ListView(
                  children: <Widget>[
                    ListTile(
                      title: Text("prve"),
                    ),
                  ],
                ),
              ),


        body: Container(
          child: CustomButton(),
        ),
      ),

    );
  

【问题讨论】:

恐怕你混淆了试图同时实现各种组件行为的术语。我建议查看材料规格以更好地了解它应该如何工作:material.io/components/navigation-drawer。例如,只有模态抽屉应该通过点击稀松布(抽屉外)或滑动来关闭 - 而您正在制作的东西没有稀松布(AppBar 始终可见)。 【参考方案1】:

据我了解,您似乎希望在滑动抽屉时为按钮设置动画。您可以在这里做的是在包含DrawerScaffold 上添加onDrawerChanged。如果抽屉正在打开或关闭,这应该检测手势。

Scaffold(
  key: _scaffoldKey,
  onDrawerChanged: (onDrawerChanged)
    debugPrint('onDrawerChanged? $onDrawerChanged');
    // onDrawerChanged is called on changes in drawer direction
    // true - gesture that the Drawer is being opened
    // false - gesture that the Drawer is being closed
    onDrawerChanged
        ? _animationController.forward()
        : _animationController.reverse();
  ,
  ...
)

通过此设置,_handleOnPressed() 可以在 IconButton(onPressed: ()); 内部被调用

【讨论】:

【参考方案2】:

你可以这样做抽屉打开然后关闭

onDrawerChanged: (change) 
    setState(() 
      isplaying = !isplaying;
      isplaying
          ? animationController.forward()
          : animationController.reverse();
    );
  

然后将其添加到 IconButton onPressed 方法

onPressed: () 
          Scaffold.of(context).openEndDrawer();
        

【讨论】:

以上是关于如何将抽屉连接到颤动的动画图标按钮?的主要内容,如果未能解决你的问题,请参考以下文章

在按钮按下时颤动旋转图标并带有动画

如何在颤动中缩小和放大图标动画?

如何将动画设置为滑动菜单图标

如何在颤动中更改抽屉图标?

如何在 Flutter 中收听抽屉打开/关闭动画

如何取消在颤动中打开和关闭导航抽屉的动画?