Screen orientation/Auto 在 Flutter 应用程序中仅在一个屏幕上旋转
Screen orientation/Auto rotation on only one screen in Flutter application
我只想在我的应用程序的一个屏幕上应用屏幕方向。我尝试使用 if condition and orientation builder 来应用它,但不知何故,它不起作用。
例如,如果用户按下自动旋转按钮,屏幕应该根据旋转进行操作,但我只想在一个屏幕上显示。
//main.dart
void main(
{
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations
([DeviceOrientation.portraitUp]);
runApp(IframeScreen());
}
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter/services.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'package:provider/provider.dart';
class IframeScreen extends StatefulWidget {
@override
_IframeScreenState createState() => _IframeScreenState();
}
class _IframeScreenState extends State<IframeScreen> {
InAppWebViewController _webViewController;
IframeScreen iframe = new IframeScreen();
_IframeScreenState(
@override
void initState() {
onLoadingTesting().then((value) {
print('check modalprogress');
});
super.initState();
}
@override
void dispose(){
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.portraitUp
]);
super.dispose();
}
InAppWebView webViewMethod() {
WidgetsFlutterBinding.ensureInitialized();
Permission.camera.request();
Permission.microphone.request();
}
}
@override
Widget build(BuildContext context) {
return ModalProgressHUD(
inAsyncCall: _saving,
child: WillPopScope(
onWillPop: (){
if(MediaQuery.of(context).orientation==Orientation.landscape){
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
}
return Future.value(true);
},
child: Scaffold(
body: OrientationBuilder(
builder: (BuildContext context,orientation) {
return Column(
children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl:
"https://appr.tc/r/158489234",
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
mediaPlaybackRequiresUserGesture: false,
debuggingEnabled: true,
),
),
onWebViewCreated: (
InAppWebViewController controller) {
_webViewController = controller;
},
androidOnPermissionRequest:
(InAppWebViewController controller, String origin,
List<String> resources) async {
return PermissionRequestResponse(
resources: resources,
action: PermissionRequestResponseAction.GRANT);
}),
),
)
],
);
}
)
),
),
);
}
为此,您应该在 main() 方法中设置首选方向,如
WidgetsFlutterBinding.ensureInitialized();
await SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitDown, DeviceOrientation.portraitUp]);
这将确保您的应用将纵向显示(如本示例代码中所设置),直到您更改它。
这里的一个建议是,在你需要横向的屏幕中,不要在Dispose函数中改变方向,而是用“WillPopScope”包裹脚手架,并实现OnWillPop()方法如下
onWillPop: () {
if (MediaQuery.of(context).orientation == Orientation.landscape) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
}
return Future.value(true);
},
这将使从横向屏幕到纵向屏幕的过渡更加平滑。
干杯!
我只想在我的应用程序的一个屏幕上应用屏幕方向。我尝试使用 if condition and orientation builder 来应用它,但不知何故,它不起作用。 例如,如果用户按下自动旋转按钮,屏幕应该根据旋转进行操作,但我只想在一个屏幕上显示。
//main.dart
void main(
{
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations
([DeviceOrientation.portraitUp]);
runApp(IframeScreen());
}
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter/services.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'package:provider/provider.dart';
class IframeScreen extends StatefulWidget {
@override
_IframeScreenState createState() => _IframeScreenState();
}
class _IframeScreenState extends State<IframeScreen> {
InAppWebViewController _webViewController;
IframeScreen iframe = new IframeScreen();
_IframeScreenState(
@override
void initState() {
onLoadingTesting().then((value) {
print('check modalprogress');
});
super.initState();
}
@override
void dispose(){
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.portraitUp
]);
super.dispose();
}
InAppWebView webViewMethod() {
WidgetsFlutterBinding.ensureInitialized();
Permission.camera.request();
Permission.microphone.request();
}
}
@override
Widget build(BuildContext context) {
return ModalProgressHUD(
inAsyncCall: _saving,
child: WillPopScope(
onWillPop: (){
if(MediaQuery.of(context).orientation==Orientation.landscape){
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
}
return Future.value(true);
},
child: Scaffold(
body: OrientationBuilder(
builder: (BuildContext context,orientation) {
return Column(
children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl:
"https://appr.tc/r/158489234",
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
mediaPlaybackRequiresUserGesture: false,
debuggingEnabled: true,
),
),
onWebViewCreated: (
InAppWebViewController controller) {
_webViewController = controller;
},
androidOnPermissionRequest:
(InAppWebViewController controller, String origin,
List<String> resources) async {
return PermissionRequestResponse(
resources: resources,
action: PermissionRequestResponseAction.GRANT);
}),
),
)
],
);
}
)
),
),
);
}
为此,您应该在 main() 方法中设置首选方向,如
WidgetsFlutterBinding.ensureInitialized();
await SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitDown, DeviceOrientation.portraitUp]);
这将确保您的应用将纵向显示(如本示例代码中所设置),直到您更改它。
这里的一个建议是,在你需要横向的屏幕中,不要在Dispose函数中改变方向,而是用“WillPopScope”包裹脚手架,并实现OnWillPop()方法如下
onWillPop: () {
if (MediaQuery.of(context).orientation == Orientation.landscape) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
}
return Future.value(true);
},
这将使从横向屏幕到纵向屏幕的过渡更加平滑。
干杯!