ufk*_*ufk 4 overlay dart flutter
我正在使用 Flutter 1.2.1 编写一个 flutter 应用程序。
initState()在my内部StatefulWidget,我调用了一个showOverlay()使用以下代码创建的函数:
void showOverlay(BuildContext context) async {
final OverlayState overlayState = Overlay.of(context);
final OverlayEntry overlayEntry = OverlayEntry(
builder: (BuildContext context)=>Positioned(
left: 0.0,
right: 0,
bottom: 90.0,
child: Container(
margin: const EdgeInsets.all(15.0),
padding: const EdgeInsets.all(3.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25.0),
border: Border.all(color: Colors.blueAccent)
),
child:
Text('Focus, lighting and contrast help',style: TextStyle(fontWeight: FontWeight.normal,
color: Colors.white,
fontSize: 18.0,
decoration: TextDecoration.none)),
)
),
);
overlayState.insert(overlayEntry);
await Future<dynamic>.delayed(Duration(seconds: 2));
overlayEntry.remove();
}
Run Code Online (Sandbox Code Playgroud)
问题是,2 秒延迟后,覆盖层仍然绘制在屏幕上。
我缺少什么?
谢谢
对于在尝试上述建议后仍然需要解决方案的任何人。我花了几个小时才找到问题。如果您的代码碰巧多次插入覆盖条目对象,则没有有效的方法可以将其删除。例如,不小心执行了多次插入覆盖的代码:
overlayEntry = _overlayEntryBuilder();
Overlay.of(context).insert(overlayEntry));
Run Code Online (Sandbox Code Playgroud)
然后尝试删除:
overlayEntry?.remove();
overlayEntry = null;
Run Code Online (Sandbox Code Playgroud)
仅当您致电时删除才有效
Overlay.of(context).insert(overlayEntry));
Run Code Online (Sandbox Code Playgroud)
一次。如果您多次调用它,它可能会创建多个实例,并且删除不起作用,它将在您的应用程序上保持活动状态。如果你不恰当地使用 onChanged 或 .listen 触发器,你可能很容易遇到这种情况。
当我调试时,我注意到以下警告:
This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets. A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索并发现了这个问题: https://github.com/flutter/flutter/issues/21638
所以为了解决这个问题我改变了
overlayState.insert(overlayEntry);
Run Code Online (Sandbox Code Playgroud)
对此:
WidgetsBinding.instance.addPostFrameCallback((_) => overlayState.insert(overlayEntry));
Run Code Online (Sandbox Code Playgroud)