flutter 对null调用Overlay.of(context)

e0bqpujr  于 2023-03-19  发布在  Flutter
关注(0)|答案(1)|浏览(133)

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

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调用了方法“insert”。接收方:空尝试呼叫:insert('覆盖条目'的示例)
抛出异常时,堆栈如下所示:#0对象.noSuchMethod(dart:核心补丁/对象补丁.dart:54:5)#1我的应用._insertOverlay(包:bbs_移动的/main.dart:49:32)#2我的应用. build...(包:bbs_mobile/main.dart:41:48)#3调度程序绑定._invokeFrameCallback(包:flutter/src/调度程序/绑定.dart:1144:15)#4调度程序绑定.处理程序绘图帧(包:flutter/src/调度程序/绑定.dart:1090:9)#5调度程序绑定.调度程序预热帧(包:flutter/src/调度程序/绑定.dart:865:7)(从类原始接收端口执行异步、类定时器和dart:补丁中删除了4帧)

owfi6suc

owfi6suc1#

这里发生的情况是Overlay.of(context)需要来自Scaffold等父Widget的上下文。
或者,你可以利用Navigator来保留相同的屏幕对象。但是记住,Flutter中的屏幕导航会重建屏幕,这样Widget就会再次重建。下面是我以前做过的这种方法的example

相关问题