Flutter: Cihaz yönündeki değişiklikler nasıl engellenir ve portreye zorlanır?


133

Uygulamamın yönünü değiştirmesini önlemek ve düzeni "dikey" olarak kalmaya zorlamak istiyorum.

Main.dart'a şunu koydum:

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

ancak Android Simulator döndür düğmelerini kullandığımda, düzen yeni cihaz yönünü "izler" ...

Bunu nasıl çözebilirim?

Teşekkürler


4
İçe aktardığınızı varsayarsak 'package:flutter/services.dart', bu bir hata olabilir: github.com/flutter/flutter/issues/13238
Brian Kung

Bunun neden senin başına geldiğinden emin değilim. Kodunuzu bir emülatörde ve ayrıca kendi cihazımda çalıştırmayı denedim ve iyi çalışıyor.
Hemanth Raj

SystemChrome.setPreferredOrientationseşzamansız olarak döner, bu nedenle runAppbir then.
Ken

Yanıtlar:


204

İçe aktar package:flutter/services.dart, ardından

Yöntemin SystemChrome.setPreferredOrientationsiçini koyun Widget build().

Misal:

  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      SystemChrome.setPreferredOrientations([
        DeviceOrientation.portraitUp,
        DeviceOrientation.portraitDown,
      ]);
      return new MaterialApp(...);
    }
  }

Güncelleme

Bu çözüm, Ekim 2019'da güncellenmiş flutter belgelerinde belirtildiği gibi bazı IOS cihazları için çalışmayabilir.

Info.plist'te UISupportedInterfaceOrientations'ı şu şekilde ayarlayarak yönlendirmeyi düzeltmelerini önerirler.

<array>
    <string>UIInterfaceOrientationPortrait</string>
</array>

Daha fazla bilgi için https://github.com/flutter/flutter/issues/27235#issuecomment-508995063


Çalıştı. Teşekkür Ederiz <3
Suthura Sudharaka

1
SystemChrome.setPreferredOrientations'ı main'e koyarsanız, şu hatayı alırsınız: ServicesBinding.defaultBinaryMessenger'a bağlama başlatılmadan önce erişildi. Bu noktada bağlamalar başlatıldığından kodun derlemeye eklenmesi işe yarar.
Altın Aslan

Teşekkür ederim. Bana yardımcı oldu ve zamanımı da kurtardı.
Ronak

78

@boeledi, Cihaz yönünü "kilitlemek" istiyorsanız ve kullanıcı telefonunu döndürürken değişmesine izin vermiyorsanız, bu aşağıdaki gibi kolayca ayarlanmıştır,

// This did not work as requirement
void main() {
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  runApp(new MyApp());
}

Bitene kadar beklemeniz setPreferredOrientationsve ardından uygulamayı başlatmanız gerekir

// This will works always for lock screen Orientation.
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
    .then((_) {
      runApp(new MyApp());
    });
}

1
Bazen derleme sırasında hata veriyor, yerel çözümler kullanmalısınız. Abeer Iqbal'ın önerdiği gibi AndroidManifest'te MainActivity'ye 'android: screenOrientation = "portrait"' ekleniyor Android'de benim için çalıştı.
Tincho825

47

iOS:

Arama SystemChrome.setPreferredOrientations()benim için çalışmıyor Device Orientationve Xcode projesinde aşağıdaki gibi değiştirmek zorunda kaldım :

görüntü açıklamasını buraya girin

Android:

Set screenOrientationiçin öznitelik portraitdosyasında ana aktivite için android/app/src/main/AndroidManifest.xmlaşağıdaki gibidir:

görüntü açıklamasını buraya girin


Ben de aynı sorunu yaşadım, iPad'de çalıştırdın mı? Sadece bir iPad'de test ettim ve bu bir sorun gibi görünüyor: github.com/flutter/flutter/issues/27235
Boy

android: Bu özellik API seviyesi 24'te eklendi.
BloodLoss

screenOrientationAndroid için API seviyesi 8'den beri kullanıyorum . @BloodLoss, sanırım belgelerde okudunuz, ama resizeableActivityöznitelik hakkında. Bağlantıyı tekrar kontrol edin. ^^
Erick M. Sprengel

22

'SetPreferredOrientations' yöntemi bir Future nesnesi döndürür. Belgelere göre bir Gelecek, gelecekte bir yerde mevcut olacak bir değeri temsil eder. Bu nedenle, kullanılabilir olana kadar bekleyip ardından uygulamaya devam etmelisiniz. Bu nedenle, tanım başına "Gelecek tamamlandığında çağrılacak geri aramaları kaydeden" "o zaman" yöntemi kullanılacaktır. Bu nedenle, bu kodu kullanacaksınız:

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

Ayrıca aşağıdaki dosyanın içe aktarılması gerekir:

"paket: flutter / services.dart"


Bunun işe yaradığını teyit edebilirim. Ancak, işlevin parametresi yoksa then () yerine whenComplete () kullanın.
Csaba Gergely

22

Android / app / src / main / AndroidManifest.xml dosyasını açın ve MainActivity'ye aşağıdaki satırı ekleyin:

android:screenOrientation="portrait"

Eğer buna sahipseniz:

<activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">

Bunun gibi bir şeyle sonuçlanmalısın:

<activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize">

Bu, Android için çalışır. İOS'ta bunu Xcode sayfasından değiştirmeniz gerekecek: https://i.stack.imgur.com/hswoe.png (Hejazi'nin dediği gibi)


teşekkürler, configChanges "oryantasyonundan" sonra "portre" sırasının önemli olduğunu UNUTMAYIN.
MR_AMDEV

14

WidgetsFlutterBinding.ensureInitialized () 'ı koyun, aksi takdirde derleme sırasında bir hata alırsınız.

import 'package:flutter/services.dart';

    void main() async => {
          WidgetsFlutterBinding.ensureInitialized(),

          await SystemChrome.setPreferredOrientations(
              [DeviceOrientation.portraitUp]), // To turn off landscape mode

          runApp(MainApp())
        };

13

Öncelikle bunu main.dart dosyasına içe aktarın

import 'package:flutter/services.dart';

O zaman kopyalayıp yapıştırmak yerine bakın (hatırlayın) ve main.dart dosyasında aşağıdaki kodu yazın

Portre moduna zorlamak için :

void main() {
  SystemChrome.setPreferredOrientations(
      [DeviceOrientation.portraitUp,DeviceOrientation.portraitDown])
      .then((_) => runApp(MyApp()),
  );

Manzara moduna zorlamak için :

   void main() {
      SystemChrome.setPreferredOrientations(
          [DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight])
          .then((_) => runApp(MyApp()),
      );

1
İnsanlara körü körüne kopyalayıp yapıştırmamalarını hatırlattığınız için teşekkür ederiz
Ryan,

1
Neden kopyalayıp yapıştırmamamı istediğinizi anladım ... son} eksik ... kopyalayıp yapıştırdım ... :)
rohan koshti

5

setPreferredOrientationa döndürür Future<void>, bu nedenle eşzamansızdır. En okunaklı yaklaşım, maineşzamansız olarak tanımlamaktır :

Future<void> main() async {
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  return runApp(new MyApp());
}

3
Kesinlikle katılmıyorum. awaitbirçok dilde mevcut olan ve her yerde bulunan bir programlama modelidir ve neyin anlamlı olduğu çok açıktır. thenyuvalama seviyeleri oluşturur. Üç veya dört devamınız varsa, thenokumak gerçekten çok zorlaşmaya başlar.
Rob Lyndon

.theniç içe yerleştirme yerine zincirlenebilir, çünkü bir FutureOr. Bu, daha okunaklı ve zarif olan daha işlevsel bir yaklaşım kullanmamı sağlıyor. Örneğin, köşeli parantez içine alınmış gövde yerine "onlar" ı zincirleyerek ifade gövdesini kullanabilirim.
Mateus Felipe

Bazen derleme sırasında hata veriyor, yerel çözümler kullanmalısınız. Abeer Iqbal'ın önerdiği gibi AndroidManifest'te MainActivity'ye 'android: screenOrientation = "portrait"' ekleniyor Android'de benim için çalıştı.
Tincho825

Bir hatayla karşılaşıyorsanız: "İşlenmemiş Özel Durum: ServicesBinding.defaultBinaryMessenger'a bağlama başlatılmadan önce erişildi." bu düzeltmeyi kullanmayı deneyin: stackoverflow.com/questions/57689492/…
Fillipe Silva

3

Aşağıdaki kod satırını main.dart dosyasına eklemeniz yeterlidir.

SystemChrome.setPreferredOrientations([
  DeviceOrientation.portraitUp,
]);

ve services.dart dosyasını içe aktarmayı unutmayın. Aşağıda bir örnek verilmiştir!

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

void main() {
    runApp(MyApp());
}


class MyApp extends StatelessWidget {
     @override
     Widget build(BuildContext context) {

      SystemChrome.setPreferredOrientations([
        DeviceOrientation.portraitUp,
      ]);

      return MaterialApp(
        home: Scaffold(
          body: Center(child: Text("A Flutter Example!")),
     ),
   );
  }
}


1

Yeni flutter sürümlerinden itibaren, preferred Orientationbir ekstra satır eklememiz gerekir, yani

 WidgetsFlutterBinding.ensureInitialized();

Yani bunun için çalışma kodu -

import 'package:flutter/services.dart';
    void main() {
          WidgetsFlutterBinding.ensureInitialized();
          SystemChrome.setPreferredOrientations([
            DeviceOrientation.portraitUp,
            DeviceOrientation.portraitDown
          ]);
          runApp(MyApp());
        }

1

İçe aktarma 'paketi: flutter / services.dart';

Ardından aşağıdaki kod satırını main.dart dosyanıza ve ana yönteminize şöyle eklersiniz:

WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitDown,
    DeviceOrientation.portraitUp,
  ]);

runApp(myApp());

0

Deneyin

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

Ayrıca android bildiriminde ve ios info.plist dosyasında ekran yönü ayarlarını da değiştirebilirsiniz.


-4

En iyi çözüm, bunu MyApp () 'nin derleme yönteminde kullanmak olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.