Flutter 在Flatter应用程序中为每个屏幕设置不同的方向会导致严重滞后
我正在设置一个纵向的主菜单屏幕,然后导航到需要横向的第二个屏幕 感觉这两个设置互相冲突,一旦我设置了横向设置,应用程序就会从瞬时响应变为2秒或屏幕延迟切换屏幕 代码片段:Flutter 在Flatter应用程序中为每个屏幕设置不同的方向会导致严重滞后,flutter,orientation,Flutter,Orientation,我正在设置一个纵向的主菜单屏幕,然后导航到需要横向的第二个屏幕 感觉这两个设置互相冲突,一旦我设置了横向设置,应用程序就会从瞬时响应变为2秒或屏幕延迟切换屏幕 代码片段: class MainMenu extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setEnabledSystemUIOverlays([]); SystemChrome.setPr
class MainMenu extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp,]);
这就是我最初的定位
按按钮导航到下一个屏幕:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);
SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft,]);
我的第二个屏幕的方向。如果我拆下SystemChrome线路,它会响应。如果我再把它们加进去,它会滞后得太久
对于子屏幕,我应该使用不同的方法吗
谢谢各位
编辑:
尝试实施以下Pete提出的基于理论的解决方案,该解决方案引发了大量:
Another exception was thrown: inheritFromWidgetOfExactType(_InheritedTheme) or inheritFromElement() was called after dispose():
控制台中出现错误(但应用程序没有崩溃,我只是在屏幕来回导航时看到一瞬间崩溃转储)。使用的代码:
class MainMenu extends StatefulWidget {
@override
_MainMenuParentState createState() => _MainMenuParentState();
}
class _MainMenuParentState extends State<MainMenu> {
@override
void initState() {
super.initState();
SystemChrome.setEnabledSystemUIOverlays([]);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp,]);
}
@override
void dispose(){
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
super.dispose();
}
另一种方法与此完全相同,我将SecondScreen转换为statefulwidget,使用initstate设置为横向,并以完全相同的方式调用dispose。不要在
build()方法中调用SystemChrome
。使您的屏幕从StatefulWidget
扩展。使用Future
触发SystemChrome
内部调用initState()
,谢谢你的回复,皮特。有没有可能在代码中显示出这是什么样子的?我已经尝试过自己摸索这个模糊的解决方案,现在它不再滞后了,但我收到了大量的信息:“引发了另一个异常:inheritFromWidgetOfExactType(_InheritedTheme)或inheritFromElement()在dispose()之后调用:”-问题中添加了代码用法。您面临的异常与此问题无关。事实并非如此。这个问题涉及到一个只有一个解决方案的问题,我不知道如何实施(如果我做错了)。因此,异常是有效的,因为答案不能可靠地解决问题。因为这是唯一一个我被给予继续下去,我觉得这需要追求,因为我可能只是以错误的方式实现了它,我需要方向。我的意思是,你给出的stacktrace与SystemChrome
完全无关。这与在中使用主题
有关。谢谢你的回复,雷米,我很感激。但我不知道你们的意思,在我上面展示的dispose方法中,并没有任何和主题相关的内容。它应该删除屏幕之间的屏幕方向。错误是因为Navigator
在dispose
之后调用的。据我所知,框架为您调用dispose()
,您不应该自己调用它。通常在你推一条路线后,旧路线仍然存在。可能在它自己调用的函数中取消设置方向,而不是dispose
。
onPressed: () {
dispose();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);