繁体   English   中英

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

How to listen to Drawer open/close animation in Flutter

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

作为 Flutter 的新手,我正在通过重新创建我现有的 Android 应用程序来进行学习练习。 但是,我无法生成“旋转、不断增长的主页图标”,该图标应与抽屉打开/关闭动画同步进行动画处理。

所需的抽屉/主页图标行为如下所示:

在此处输入图片说明

我通过在 Android 中实现

DrawerListener.onDrawerSlide(View drawerView, float slideOffset) 

我在 Flutter 中执行此操作的天真方法是使用 ScaleTransition 和 RotationTransition 来监听打开/关闭抽屉的相同动画。

我可以看到 ScaffoldState 有一个 DrawerControllerState,但它是私有的。

final GlobalKey<DrawerControllerState> _drawerKey = new GlobalKey<DrawerControllerState>();

即使我可以以某种方式访问​​ DrawerControllerState(我不知道如何访问),我也无法访问 _animationChanged() 和 _controller,因为它们都是 DrawerControllerState 的私有成员。

我觉得我以错误的方式来解决这个问题,并且有一种更好的方法对 Flutter 更自然,但我看不到。

请任何人都可以描述一下 Flutter 实现这一点的方式吗?

1 个回复

可以先参考这里其他人在stackoverflow上的回复

我的解决:

在 DrawerWidget 上获取抽​​屉状态

initState() : open drawer
dispose() : close drawer

DrawerService Provider 的流抽屉状态在此处输入图片说明

查看完整代码

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

import 'package:provider/provider.dart';


void main() {
  runApp(
    MultiProvider(
      providers: [
        Provider(create: (_) => DrawerService()),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  DrawerService _drawerService;
  String drawerStatus = 'close';
  @override
  void initState() {
    super.initState();
    _drawerService = Provider.of(context, listen: false);
    _listenDrawerService();
  }

  _listenDrawerService() {
    _drawerService.status.listen((status) {
      if(status) {
        drawerStatus = 'open';
      } else {
        drawerStatus = 'close';
      }
      setState(() { });
    });
  }

  @override
  Widget build(BuildContext context) {
    Color bgColor = Colors.yellow;
    if(drawerStatus == 'open') {
      bgColor = Colors.red;
    }

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      drawer: DrawerWidget(),
      body: Container(
        decoration: BoxDecoration(color: bgColor),
        height: 300,
        child: Center(child: Text(drawerStatus),),
      ),
    );
  }
}


class DrawerWidget extends StatefulWidget {
  @override
  _DrawerWidgetState createState() => _DrawerWidgetState();
}

class _DrawerWidgetState extends State<DrawerWidget> {  
  DrawerService _drawerService;

  @override
  void initState() {
    super.initState();
    _drawerService = Provider.of(context, listen: false);
    _drawerService.setIsOpenStatus(true);
  }

  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: Center(child: Text('drawer'),),
    );
  }

  @override
  void dispose() {
    super.dispose();
    _drawerService.setIsOpenStatus(false);
  }
}

class DrawerService {
  StreamController<bool> _statusController = StreamController.broadcast();
  Stream<bool> get status => _statusController.stream;

  setIsOpenStatus(bool openStatus) {
    _statusController.add(openStatus);
  }
}

希望对身体有所帮助

1 如何使用Flutter中的按键以编程方式打开和关闭抽屉?

当我按一个图标时,我正在以编程方式打开和关闭抽屉。 我正在尝试使用键,但是运气不佳。 我找到了这篇文章-Flutter:如何以编程方式打开Drawer ,但是我遇到了问题。 我有一列图标(请参见屏幕截图),我将其包含在一个文件中,而我的抽屉位于另一个文件中,这两个图标显然都包含在第三个文件中(这是 ...

4 如何在JPanel中收听关闭

我正在使用一些奇怪的遗留代码。 他们有一个实现JPanel的自定义对象。 此JPanel对象是主应用程序中的辅助弹出屏幕。 我遇到的问题是检测辅助弹出屏幕何时关闭。 我试图为该类实现一个WindowListener ,但是当我尝试添加它时,没有与该对象关联的JFrame 。 我假设 ...

5 每次在Flutter中打开抽屉时,如何防止重新构建抽屉?

在Flutter Debug&Profile模式下,我遇到了一个主要的性能问题。 当我打开抽屉时,即使在配置文件模式下,我的应用程序也下降到约20 FPS,这是不可接受的。 我曾经遇到过类似的问题,这些问题过去可以自己解决,因为Flutter(在启动时)喜欢使用旧版应用程序,直到我热加载或热重启为止 ...

2019-11-30 14:36:31 0 412   flutter
6 我如何在 Flutter 上收听 isDrawerOpen?

我想在抽屉打开时隐藏一些小部件。 (这意味着当用户打开抽屉时,我需要隐藏一些小部件) 目前,我正在使用 但这不是listen 。 有没有办法听抽屉回调? ...

7 Flutter:可以检测抽屉何时打开?

是否可以检测抽屉何时打开,以便我们可以运行一些例程来更新其内容? 我的一个典型用例是显示关注者、喜欢者的数量……为此,我需要轮询服务器以获取此信息,然后显示它。 我试图实现一个 NavigatorObserver 来捕捉抽屉可见/隐藏的时刻,但 NavigatorObserver 没有检测到有关 ...

2018-04-22 11:03:37 8 12800   flutter
9 导航抽屉打开和关闭的自定义动画

让我们做一些挑战。 我看过这个动画导航抽屉: 我想实现它,因为它是一个很好的效果。 我试图通过创建自定义视图来获得效果,并且在触摸时我获得至少50%的类似效果。 我想从我的自定义视图到导航视图实现我的ondraw()和ontouch()方法。 怎么做的? 任何人都有任何线索? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM