首页 > 解决方案 > Overlay.of(context) 在 null 上调用

问题描述

所以我希望这个覆盖小部件出现在所有页面中并且不想在页面之间的转换过程中受到干扰,它会抛出这个异常并且没有构建覆盖小部件,我在这里做错了什么?

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);

    return MaterialApp(
        color: Colors.white,
        title: 'Gratitude',
        navigatorKey: AppNavigator.navigatorKey,
        onGenerateRoute: AppNavigator.onGenerateRoute,
        theme: ThemeData(
            fontFamily: AppFonts.POPPINS,
            textTheme: theme.textTheme.apply(
              fontFamily: AppFonts.POPPINS,
              displayColor: AppColors.TEXT_COLOR,
            )),
        builder: (context, child) {
          final data = MediaQuery.of(context);
          final smallestSize = min(data.size.width, data.size.height);
          final textScaleFactor =
              min(smallestSize / AppConstants.designScreenSize.width, 1.0);
          return MediaQuery(
              data: data.copyWith(textScaleFactor: textScaleFactor),
              child: Builder(
                builder: (context) {
                  WidgetsBinding.instance
                      .addPostFrameCallback((_) => _insertOverlay(context));
                  return child;
                },
              ));
        });
  }

  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),
              ),
            ),
          ),
        );
      }),
    );
  }
}

错误

══╡被调度程序库捕获的例外╞═════════════════════════════════════════ ════════════════ 在调度程序回调期间引发以下 NoSuchMethodError:在 null 上调用了方法“插入”。接收者:空尝试调用:插入('OverlayEntry'的实例)

当抛出异常时,这是堆栈:#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5) #1 MyApp._insertOverlay (package:bbs_mobile/main.dart:49:32) # 2 MyApp.build... (package:bbs_mobile/main.dart:41:48) #3 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15) #4 SchedulerBinding.handleDrawFrame (package: flutter/src/scheduler/binding.dart:1090:9) #5 SchedulerBinding.scheduleWarmUpFrame。(包:flutter/src/scheduler/binding.dart:865:7)(从 _RawReceivePortImpl 类、_Timer 类和 dart:async-patch 中删除了 4 帧)

标签: flutternavigationoverlay

解决方案


推荐阅读