首页 > 解决方案 > 在 Flutter 的后台如何隐藏应用栏?

问题描述

当我显示后台应用程序列表时,我想隐藏应用程序栏。

在此处输入图像描述

这是源代码

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar:  AppBar(
          title: Text('Hellow World'),
        ),
        body: Center (child: Text('Hello world')));
  }
}

我试图在应用程序进入后台时隐藏应用程序栏,并在应用程序回到前台时显示它,但它不起作用。

class HomePageState extends State<HomePage> with WidgetsBindingObserver {

  bool _appbar = true;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: PreferredSize(
          preferredSize: Size(double.infinity, 56),
          child: Visibility(
            visible: _appbar,
            child: AppBar(
              backgroundColor: Colors.green,
              elevation: 0.0,
              title: Text('Title'),
            ),
          ),
        ),
        body: Center(
          child: Text('Test'),
        ));
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed:
        setState(() {
          _appbar = true;
        });
        break;
      case AppLifecycleState.inactive:
        setState(() {
          _appbar = false;
        });
        break;
      case AppLifecycleState.paused:
        break;
      case AppLifecycleState.detached:
        break;
    }
  }
}

标签: flutterdart

解决方案


您可以尝试在为“最近的应用程序”视图拍摄快照之前更新屏幕。将WidgetsBindingObserver添加到您的屏幕以检查状态更改。

class HomePage extends StatefulWidget with WidgetsBindingObserver{
...
}

向当前的 WidgetsBinding 实例添加一个观察者,并在对象从屏幕上移除时移除观察者的方法。

@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addObserver(this);
}

@override
void dispose() {
  WidgetsBinding.instance.removeObserver(this);
  super.dispose();
}

然后您可以在应用程序状态更改时更新屏幕。“最近使用的应用程序”的屏幕快照是在应用程序暂停之前拍摄的。我建议更新屏幕inactive状态,因为它是之前的状态paused。然后在应用状态为 时再次更新屏幕resumed

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  switch (state) {
    case AppLifecycleState.resumed:
      // TODO: update screen to add app bar again
      break;
    case AppLifecycleState.inactive:
      // TODO: update screen to remove app bar
      break;
    case AppLifecycleState.paused:
      break;
    case AppLifecycleState.detached:
      break;
  }
}

这似乎是一个奇怪的用例,但这里的另一个选择是一直隐藏应用栏。


推荐阅读