flutter - 在 Flutter 中添加 OverlayEntry
问题描述
我正在尝试将 Container 插入 Overlay,但此代码出现错误。
class _MyHomePageState extends State<MyHomePage> {
@override
void didChangeDependencies() {
super.didChangeDependencies();
final entry = OverlayEntry(builder: (BuildContext overlayContext) {
return Container(
height: 50.0,
width: 50.0,
color: Colors.blue,
);
});
_addOverlay(entry);
}
void _addOverlay(OverlayEntry entry) async {
Overlay.of(context).insert(entry);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter'),
),
body: Center(),
);
}
}
这是错误
在构建期间调用 setState() 或 markNeedsBuild()。这个 Overlay 小部件不能被标记为需要构建,因为框架已经在构建小部件的过程中。仅当其祖先之一当前正在构建时,小部件才能在构建阶段标记为需要构建。这个例外是允许的,因为框架在子组件之前构建父窗口小部件,这意味着将始终构建脏后代。否则,框架可能不会在此构建阶段访问此小部件...
先感谢您。
解决方案
自从上次更新到 Flutter 0.8.1 以来,我也注意到了这个变化。我修复了这个以在最小延迟后添加覆盖
Timer.run(() { Overlay.of(context).insert(calendarOverlay);});
现在这有效,但感觉就像一个黑客......
所以在我的构建中,当覆盖层应该出现时,我使用这个代码..
如果有人有更好的解决方案,我很感兴趣;-)
约翰
更新:我发现这段代码也可以工作:
final overlay = Overlay.of(context);
WidgetsBinding.instance.addPostFrameCallback((_) => overlay.insert(entry));
它使我免于包含计时器...
推荐阅读
- azure - 如何使用 Azure 数据工厂 v2 在 Azure SQL 数据库的所有表中更新/插入记录
- javascript - AFrame - 是否可以用没有黑色边框的自定义图像替换标记?
- c# - 无法加载 documentdb.spatial.sql
- java - 在spring boot中连接到多个数据库
- sql - 根据条件将值连接到 SELECT
- javascript - 是否可以在查看时更新 php 文件?
- python - VBA 宏不适用于 CSV 文件
- android - Flutter-如何制作多个 notifyListeners()?
- sql-server - 更新和删除不起作用 vb.net
- symfony - symfony easyadmin 新文章被提交和存储,但没有 author_id