Flutter 颤振:如何按需设置和锁定屏幕方向

Flutter 颤振:如何按需设置和锁定屏幕方向,flutter,screen-orientation,device-orientation,Flutter,Screen Orientation,Device Orientation,在我的一个颤振页面上,我需要将屏幕设置为横向模式并锁定,这样它就不能旋转到纵向模式,而只能在一个页面上。因此,我们需要一种方法来动态启用此功能。有人知道怎么做吗 我希望它向左或向右旋转横向,但不要进入纵向模式。首先导入服务包: //Do this in main.dart SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) .then((_) { runApp(MyApp()); }); import'

在我的一个颤振页面上,我需要将屏幕设置为横向模式并锁定,这样它就不能旋转到纵向模式,而只能在一个页面上。因此,我们需要一种方法来动态启用此功能。有人知道怎么做吗


我希望它向左或向右旋转横向,但不要进入纵向模式。

首先导入服务包:

//Do this in main.dart
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
  .then((_) {
runApp(MyApp());
});
import'package:flatter/services.dart'

这将允许您访问
SystemChrome
类,该类控制操作系统图形界面的特定方面以及它与应用程序的交互方式

加载小部件时,请执行以下操作:

@override
void initState(){
  super.initState();
  SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
  ]);
}
@override
dispose(){
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.landscapeRight,
    DeviceOrientation.landscapeLeft,
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);
  super.dispose();
}
import services.dart


void main() {
    SystemChrome.setPreferredOrientations(
    [DeviceOrientation.portraitUp]
     )
        .then((_) {
          runApp(new MyApp());
        });
    }
然后,当我离开页面时,将其恢复到正常状态,如下所示:

@override
void initState(){
  super.initState();
  SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
  ]);
}
@override
dispose(){
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.landscapeRight,
    DeviceOrientation.landscapeLeft,
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);
  super.dispose();
}
import services.dart


void main() {
    SystemChrome.setPreferredOrientations(
    [DeviceOrientation.portraitUp]
     )
        .then((_) {
          runApp(new MyApp());
        });
    }

我会使用一个简单的mixin来锁定手机。以下解决方案将整个应用程序锁定为纵向或将特定屏幕设置为纵向,同时保持旋转

import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';

/// Forces portrait-only mode application-wide
/// Use this Mixin on the main app widget i.e. app.dart
/// Flutter's 'App' has to extend Stateless widget.
///
/// Call `super.build(context)` in the main build() method
/// to enable portrait only mode
mixin PortraitModeMixin on StatelessWidget {
  @override
  Widget build(BuildContext context) {
    _portraitModeOnly();
    return null;
  }
}

/// Forces portrait-only mode on a specific screen
/// Use this Mixin in the specific screen you want to
/// block to portrait only mode.
///
/// Call `super.build(context)` in the State's build() method
/// and `super.dispose();` in the State's dispose() method
mixin PortraitStatefulModeMixin<T extends StatefulWidget> on State<T> {
  @override
  Widget build(BuildContext context) {
    _portraitModeOnly();
    return null;
  }

  @override
  void dispose() {
    _enableRotation();
  }
}

/// blocks rotation; sets orientation to: portrait
void _portraitModeOnly() {
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);
}

void _enableRotation() {
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
    DeviceOrientation.landscapeLeft,
    DeviceOrientation.landscapeRight,
  ]);
}
要在特定屏幕中阻止旋转,请在特定屏幕的状态下执行
graphicstatefulmodemixin
。记住在州的
build()
方法中调用
super.build(context)
,在
dispose()
方法中调用
super.dispose()
。如果您的屏幕是一个无状态小部件-只需重复应用程序的解决方案(上一个示例),即使用
mixin

/// Specific screen
class SampleScreen extends StatefulWidget {
  SampleScreen() : super();

  @override
  State<StatefulWidget> createState() => _SampleScreenState();
}

class _SampleScreenState extends State<SampleScreen>
    with PortraitStatefulModeMixin<SampleScreen> {
  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Text("Flutter - Block screen rotation example");
  }

  @override
  void dispose() {
     super.dispose();
  }
}
///特定屏幕
类SampleScreen扩展StatefulWidget{
示例屏幕():超级();
@凌驾
State createState()=>_SampleScreenState();
}
类_示例Crenstate扩展状态
带着肖像的摩德米辛{
@凌驾
小部件构建(构建上下文){
super.build(上下文);
返回文本(“颤振-块屏幕旋转示例”);
}
@凌驾
无效处置(){
super.dispose();
}
}

Dart 2.1中使用这种语法的混入有时由于方向信息为空而无法工作。 您可以这样简单地使用它:

@override
void initState(){
  super.initState();
  SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
  ]);
}
@override
dispose(){
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.landscapeRight,
    DeviceOrientation.landscapeLeft,
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);
  super.dispose();
}
import services.dart


void main() {
    SystemChrome.setPreferredOrientations(
    [DeviceOrientation.portraitUp]
     )
        .then((_) {
          runApp(new MyApp());
        });
    }

//启动应用程序后等待设置屏幕方向->然后锁定方向

导入
服务。dart
和您的
无效主功能应该如下所示:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown])
    .then((_) {
      runApp(new MyApp());
    });
}
void main(){

    WidgetsFlutterBinding.ensureInitialized();
    SystemChrome.setPreferredOrientations(
       [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown])
       .then((_){
           runApp(MyApp());
       }
    );
}

您可以为此使用方向辅助对象。它的主要目标是为应用程序中的每个屏幕设置方向。

导入services.dart包,并添加以下代码以将设备方向锁定为向上模式:

 import 'package:flutter/services.dart';

 main() {
     WidgetsFlutterBinding.ensureInitialized();
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
     runApp(MyHomePage());
 }

对于iOS来说很重要

  • 在info.plist文件中启用方向。比如说
步骤

  • 在main.dart文件中设置方向。在我的例子中,我的应用程序除了一个屏幕外,只支持纵向,所以我需要在第一时间设置纵向模式。比如说
  • 在需要旋转的屏幕中添加以下代码

首先,将整个应用程序方向锁定为纵向模式

//Do this in main.dart
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
  .then((_) {
runApp(MyApp());
});
第二,转到要更改方向的特定屏幕

@override
void initState() {
super.initState();

SystemChrome.setPreferredOrientations([
  DeviceOrientation.portraitUp,
  DeviceOrientation.landscapeRight,
  DeviceOrientation.landscapeLeft
]);
}


要使用SystemChrome,您必须添加
'package:flutter/services.dart'

,但似乎只在android上工作哦,我没有意识到。这是很有可能的,我只在Android上测试过。没关系,它可以通过平台频道解决,我认为很快就会得到修复,指定这个bug在几个月前就解决了,而且这个解决方案现在也可以在IOS上运行。据我所见,在dispose方法中设置首选方向不是一个好主意。如果您导航到另一个路由并打算返回,则不会调用dispose方法。我已尝试过您的mixin类-无状态版本工作正常,但是如果我的statefull类调用其disposed方法,statefull one会引发异常。注意,我在类中调用
super.dispose()
。以下是错误:I/flatter(29686):在完成小部件树时引发了以下断言:I/flatter(29686):\u MultiPlayerAcceptPageState.dispose未能调用super.dispose。I/flatter(29686):dispose()实现必须始终调用其超类dispose()方法,以确保小部件使用的所有I/flatter(29686):资源都已完全释放。有状态版本也有相同的例外。你解决这个问题了吗?解决了!如果你使用Android Studio,这是显而易见的。它说
dispose()
被注释为
@mustCallSuper
。这意味着您需要在mixin函数本身中添加
super.dispose()
。虽然此代码可能会提供问题的解决方案,但最好添加上下文以了解其工作原理。这可以帮助未来的用户学习,并将这些知识应用到他们自己的代码中。在解释代码时,用户可能会以投票的形式给出正面反馈。如果出现无状态小部件,该怎么办?