首页 > 解决方案 > 在 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

解决方案


自从上次更新到 Flutter 0.8.1 以来,我也注意到了这个变化。我修复了这个以在最小延迟后添加覆盖

Timer.run(() { Overlay.of(context).insert(calendarOverlay);});

现在这有效,但感觉就像一个黑客......

所以在我的构建中,当覆盖层应该出现时,我使用这个代码..

如果有人有更好的解决方案,我很感兴趣;-)

约翰

更新:我发现这段代码也可以工作:

final overlay = Overlay.of(context);
WidgetsBinding.instance.addPostFrameCallback((_) => overlay.insert(entry));

它使我免于包含计时器...


推荐阅读