フラッターページの1つで、画面を横向きモードに設定してロックし、縦向きモードに回転できないようにする必要がありますが、1ページだけです。そのため、この機能をオンザフライで有効にする方法が必要です。誰もこれを行う方法を知っていますか?
縦向きモードだけではなく、横向き左または横向き右に回転させたい。
最初にサービスパッケージをインポートします。
import 'package:flutter/services.Dart';
これにより、SystemChrome
クラスにアクセスできます。このクラスは"Controls specific aspects of the operating system's graphical interface and how it interacts with the application."
ウィジェットをロードするとき、次のようにします。
@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();
}
シンプルなmixin tolock phone in portraitを使用します。次のソリューションでは、portraitでアプリ全体をロックするか、特定の画面を設定します他の回転を維持しながらの肖像画。
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,
]);
}
アプリ全体で回転をブロックするメインPortraitModeMixin
ウィジェットにApp
を実装します。 super.build(context)
メソッドでWidget build(BuildContext context)
メソッドを呼び出すことを忘れないでください。
/// Main App widget
class App extends StatelessWidget with PortraitModeMixin {
const App();
@override
Widget build(BuildContext context) {
super.build(context);
return CupertinoApp(
title: 'Flutter Demo',
theme: CupertinoThemeData(),
home: Text("Block screen rotation example"),
);
}
}
特定の画面で回転をブロックする特定の画面の状態でPortraitStatefulModeMixin<SampleScreen>
を実装します。状態のsuper.build(context)
メソッドでbuild()
を呼び出し、super.dispose()
メソッドでdispose()
を呼び出すことを忘れないでください。画面がStatelessWidgetの場合-アプリのソリューション(前の例)を繰り返します。つまり、PortraitModeMixin
を使用します。
/// 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();
}
}
このような構文のミックスインはDart 2.1から機能します