我想要一个小部件,将坐在整个应用程序的顶部.当我试着用Overlay.of(context).insert来做这件事时,覆盖层会在替换该路由后消失.有没有一种方法可以让我的应用程序上有一个小部件,即使后来屏幕被弹出?

推荐答案

也许存在一种更理想的方式,但作为一种 Select ,这是一个包含两个页面的示例,本地导航器和覆盖.

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

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

class _MyAppState extends State<MyApp> {
  final _navigatorKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: WillPopScope(
        onWillPop: () async => !await _navigatorKey.currentState.maybePop(),
        child: LayoutBuilder(
          builder: (context, constraints) {
            WidgetsBinding.instance.addPostFrameCallback((_) => _insertOverlay(context));
            return Navigator(
              key: _navigatorKey,
              onGenerateRoute: (RouteSettings settings) {
                switch (settings.name) {
                  case '/page2':
                    return MaterialPageRoute(builder: (_) => Page2());
                  default:
                    return MaterialPageRoute(builder: (_) => Page1(_navigatorKey));
                }
              },
            );
          },
        ),
      ),
    );
  }

  void _insertOverlay(BuildContext context) {
    return Overlay.of(context).insert(
      OverlayEntry(builder: (context) {
        final size = MediaQuery.of(context).size;
        print(size.width);
        return Positioned(
          width: 56,
          height: 56,
          top: size.height - 72,
          left: size.width - 72,
          child: Material(
            color: Colors.transparent,
            child: GestureDetector(
              onTap: () => print('ON TAP OVERLAY!'),
              child: Container(
                decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.redAccent),
              ),
            ),
          ),
        );
      }),
    );
  }
}

class Page1 extends StatelessWidget {
  final GlobalKey<NavigatorState> navigatorKey;

  Page1(this.navigatorKey);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.green[200],
      appBar: AppBar(title: Text('Page1')),
      body: Container(
        alignment: Alignment.center,
        child: RaisedButton(
          child: Text('go to Page2'),
          onPressed: () => navigatorKey.currentState.pushNamed('/page2'),
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.yellow[200],
      appBar: AppBar(title: Text('back to Page1')),
      body: Container(
        alignment: Alignment.center,
        child: Text('Page 2'),
      ),
    );
  }
}

enter image description here

Flutter相关问答推荐

为什么小部件会在其父文件中重建,但放在单独文件中时却不会重建?

Flutter -使用最小高度展开

为什么PUT方法没有发出任何响应?

带有图标抖动的自定义下拉按钮

将记录/元组用作SplayTreeMap中的键

参数类型';List<;Dynamic&>不能分配给参数类型';List<;SingleChildWidget&>';

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

dotenv:未处理的异常:FileNotFoundError的实例

Flutter中不使用Container是否可以做margin

如何修改来自合并 list 的 Android list 权限?

在Flutter中为容器实现线性渐变背景动画

用户文档 ID 与 Firestore 中的用户 ID 相同

我对 Flutter Apk 有疑问

在 Flutter 中,SpinEdit 叫什么?

输入处于活动状态时如何设置文本字段标签的样式?

如何从底部导航栏打开 bottomModal 表?

Flutter 错误:正文可能正常完成,导致返回null

出现错误;运算符[]不是为对象类型定义的?功能()'

Flutter:滚动一个ListWheelScrollView,无法获取选中项的状态

是否可以在 Flutter 中使用 ToggleButtons 在页面 PageView 之间切换?