因此,我希望这个覆盖小部件出现在所有页面中,不希望在页面之间的转换过程中受到干扰,它抛出此异常,覆盖小部件未构建,我在这里做错了什么?
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帧)
1条答案
按热度按时间owfi6suc1#
这里发生的情况是
Overlay.of(context)
需要来自Scaffold等父Widget的上下文。或者,你可以利用Navigator来保留相同的屏幕对象。但是记住,Flutter中的屏幕导航会重建屏幕,这样Widget就会再次重建。下面是我以前做过的这种方法的example。