Я б використав простий мікс, щоб заблокувати телефон у портреті . Наступне рішення блокує всю програму в портретному режимі або встановлює певні екрани в портретні, зберігаючи обертання в іншому випадку.
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
mixin PortraitModeMixin on StatelessWidget {
@override
Widget build(BuildContext context) {
_portraitModeOnly();
return null;
}
}
mixin PortraitStatefulModeMixin<T extends StatefulWidget> on State<T> {
@override
Widget build(BuildContext context) {
_portraitModeOnly();
return null;
}
@override
void dispose() {
_enableRotation();
}
}
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)
методі.
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
.
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