【发布时间】:2018-10-02 13:29:34
【问题描述】:
是否可以检测抽屉何时打开,以便我们可以运行一些例程来更新其内容?
我的一个典型用例是显示关注者、点赞者的数量......为此,我需要轮询服务器以获取此信息,然后显示它。
我尝试实现一个 NavigatorObserver 来捕捉 Drawer 可见/隐藏的时刻,但 NavigatorObserver 没有检测到有关 Drawer 的任何信息。
这是链接到 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],
);
}
}
感谢您的帮助。
【问题讨论】:
-
NavigatorObserver 不是解决方案。你能改为展示你是如何使用 Drawer 的吗?
-
嗨@RémiRousselet。我使用Drawer的方式没有什么特别的,没什么好说的。我只是在 Scaffold 级别初始化抽屉。我正在等待解决方案来检测抽屉何时打开以进一步详细说明。但是正如您提到的 NavigatorObserver 不是解决方案,您还有其他想法吗?
标签: flutter