是否可以检测抽屉何时打开,以便我们可以运行一些例行程序来更新其内容?

我的一个典型用例是显示关注者、喜欢者的数量...为此,我需要轮询服务器以获取此信息,然后显示它.

我试图实现一个NavigatorWatch来捕捉可见/隐藏抽屉的时刻,但NavigatorWatch没有检测到有关抽屉的任何信息.

以下是链接到NavigatorObserver的代码:

import 'package:flutter/material.dart';

typedef void OnObservation(Route<dynamic> route, Route<dynamic> previousRoute);
typedef void OnStartGesture();

class NavigationObserver extends NavigatorObserver {
  OnObservation onPushed;
  OnObservation onPopped;
  OnObservation onRemoved;
  OnObservation onReplaced;
  OnStartGesture onStartGesture;

  @override
  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
    if (onPushed != null) {
      onPushed(route, previousRoute);
    }
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
    if (onPopped != null) {
      onPopped(route, previousRoute);
    }
  }

  @override
  void didRemove(Route<dynamic> route, Route<dynamic> previousRoute) {
    if (onRemoved != null)
      onRemoved(route, previousRoute);
  }

  @override
  void didReplace({ Route<dynamic> oldRoute, Route<dynamic> newRoute }) {
    if (onReplaced != null)
      onReplaced(newRoute, oldRoute);
  }

  @override
  void didStartUserGesture() { 
    if (onStartGesture != null){
      onStartGesture();
    }
  }
}

以及这个观察者的初始化

void main(){
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final NavigationObserver _observer = new NavigationObserver()
                                              ..onPushed = (Route<dynamic> route, Route<dynamic> previousRoute) {
                                                print('** pushed route: $route');
                                              }
                                              ..onPopped = (Route<dynamic> route, Route<dynamic> previousRoute) {
                                                print('** poped route: $route');
                                              }
                                              ..onReplaced = (Route<dynamic> route, Route<dynamic> previousRoute) {
                                                print('** replaced route: $route');
                                              }
                                              ..onStartGesture = () {
                                                print('** on start gesture');
                                              };

  @override
  void initState(){
    super.initState();
  }

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Title',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new SplashScreen(),
        routes: <String, WidgetBuilder> {
          '/splashscreen': (BuildContext context) => new SplashScreen(),
        },
        navigatorObservers: <NavigationObserver>[_observer],
    );
  }
}

谢谢你的帮助.

推荐答案

我认为一个简单的解决方案是覆盖AppBarleading属性,这样当按下菜单图标时,您就可以访问它,并基于此运行API调用.

然而,我可能误解了您的问题,因为使用您提供的用例,您通常需要以这样一种方式管理它:您可以对任何会自动更新值的更改进行listen%的管理,因此我不确定当抽屉打开时您try 触发的是什么.

不管怎样,这里就是一个例子.

enter image description here

class DrawerExample extends StatefulWidget {
  @override
  _DrawerExampleState createState() => new _DrawerExampleState();
}

class _DrawerExampleState extends State<DrawerExample> {
  GlobalKey<ScaffoldState> _key = new GlobalKey<ScaffoldState>();
  int _counter =0;
  _handleDrawer(){
      _key.currentState.openDrawer();

           setState(() {
          ///DO MY API CALLS
          _counter++;
        });

  }
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: _key,
      appBar: new AppBar(
        title: new Text("Drawer Example"),
        centerTitle: true,
        leading: new IconButton(icon: new Icon(
          Icons.menu
        ),onPressed:_handleDrawer,),
      ),
      drawer: new Drawer(
        child: new Center(
          child: new Text(_counter.toString(),style: Theme.of(context).textTheme.display1,),
        ),
      ),
    );
  }
}

Flutter相关问答推荐

在Flutter 动中绘制ECG图

MobX Build_Runner问题:不生成.G文件(Flutter )

为什么Build_Runner的输出为0?

摆动如何更改弹出菜单项高亮显示 colored颜色 半径

修复后期变量的抖动皮棉

Flutter :执行com.android.build.gradle.internal.tasks.MergeNativeLibsTask$MergeNativeLibsTaskWorkAction时出现故障

如果我使用搜索栏,如何在嵌套滚动视图中停止自动滚动?

顶部对齐ListTile的[前导、标题、尾随]小部件

在flutter中实现类似3D的可滚动堆叠分页列表

Riverpod 2.0-如何使用FutureOr和AutoDisposeSyncNotificationer处理api状态代码?

Flutter中pubspec.yaml文件中的name参数是什么?

Flutter开发中,如何通过'nfc_manager'插件在Android设备上避免默认的New Tag Scanned弹出窗口?

如何在Flutter中动态绘制一条从A点到B点的线?

我可以定义一次 sharedPreferences 并在需要数据显示到 flutter 应用程序时调用它吗?

Flutter Websockets MacOS:相同的代码在调试模式下有效,但在发布模式下无效:(操作系统错误:提供了 node 名或服务名..)

改变步进器的线条 colored颜色 Flutter

扩展磁贴尾随图标在与一个磁贴交互时更新列表中的所有内容.如何只更改展开图块的图标?

有什么方法可以将 ChangeNotifier 与 ValueListenableBuilder 一起使用

如何在 flutter 中更改日期 Select 器 colored颜色 ?

参数类型MaterialPageRoute不能分配给参数类型String