我要设置一个纵向的主菜单屏幕,然后导航到第二个需要横向的屏幕。
感觉这两个设置相互冲突,一旦我设置了横向设置,应用程序就会从瞬时响应变为2秒或屏幕滞后,切换到屏幕。
代码段:
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();
}
我也在initState中尝试过使用Future,但是每次的错误都是相同的。
在onPress中调用Dispose:
onPressed: () {
dispose();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
与我完全一样,我已将SecondScreen转换为一个statefulwidget,使用initstate设置为landscape,并以完全相同的方式进行处置。
答案 0 :(得分:2)
请勿在{{1}}方法内放置对SystemChrome
的任何调用。使屏幕从build()
延伸。用StatefulWidget
触发SystemChrome
内部的initState()
呼叫。