在颤动中强制纵向视图

Posted

技术标签:

【中文标题】在颤动中强制纵向视图【英文标题】:Force portrait view in flutter 【发布时间】:2020-05-07 00:03:21 【问题描述】:

我已尝试使用在此站点上的一个线程上找到的此代码,但所发生的只是我的应用程序加载了一个白屏。有没有更好的方法来强制纵向视图颤动?设置起来似乎很简单。

void main() async 
  ///
  /// Force the layout to Portrait mode
  ///
  await SystemChrome.setPreferredOrientations(
      [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);

  runApp(new MaterialApp(
    debugShowCheckedModeBanner: false,
    home: LoginScreen(),
  ));

【问题讨论】:

您的测试设备是 android 还是 ios 如果你得到一个白屏,这意味着你在调用runApp之前得到一个异常。尝试调试应用时出现什么异常? 它的安卓.... 错误是:E/flutter (27219):[错误:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:在绑定初始化之前访问了 ServicesBinding.defaultBinaryMessenger。跨度> OP @SamCromer 主要是在问:有没有更好的方法?每个人都指出的白屏错误修复是次要的,你们不是解释为什么这是修复。此外,没有人指出通过SystemChrome 强制定向存在问题。问题在于将 iPad 的多任务标志“需要全屏”设置为非默认值 true。如我的回答below所示。 【参考方案1】:

将代码更改为

void main() 
 WidgetsFlutterBinding.ensureInitialized();
 SystemChrome.setPreferredOrientations(
 [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown])
 .then((_) => runApp(new MaterialApp(
         debugShowCheckedModeBanner: false,
         home: LoginScreen(), 
      )));

`

【讨论】:

【参考方案2】:

来自评论中的异常:

Unhandled Exception: ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized

你需要打电话

WidgetsBinding.ensureInitialized();

致电SystemChrome.setPreferredOrientations之前

【讨论】:

【参考方案3】:

解决方案

    将您的代码更改为:
void main() async 
  WidgetsFlutterBinding.ensureInitialized();

  ///
  /// Force the layout to Portrait mode
  ///
  await SystemChrome.setPreferredOrientations(
      [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);

  runApp(new MaterialApp(
    debugShowCheckedModeBanner: false,
    home: LoginScreen(),
  ));

    打开您的 Xcode 项目并转到 Target -> 部署信息 -> Require Full Screentrue。这将反映在您的 ios/Runner/Info.plist 中以具有以下值:
    <key>UIRequiresFullScreen</key>
    <true/>

说明

这里有几点需要说明:

    你忘记了WidgetsFlutterBinding.ensureInitialized()。这很重要,因为您是异步 main 方法上的“awaiting”。 根据setPreferredOrientations 的文档,iPad 多任务处理存在限制:

只有在 iPad 上启用多任务处理时,才会采用此设置 已禁用。

为了缓解 #2,来自文档:

如果您决定退出多任务处理,您可以通过以下方式执行此操作 在 Xcode 部署信息中将“需要全屏”设置为 true。

【讨论】:

以上是关于在颤动中强制纵向视图的主要内容,如果未能解决你的问题,请参考以下文章

Listview在颤动中强制滚动到顶部

如何强制 iOS 应用以纵向模式启动

强制一个视图控制器只为横向

如何在颤动中强制应用程序进入肖像模式

在 iOS 9 中强制视图控制器方向

如何强制对话框的横向模式?