स्पंदन: उपकरण अभिविन्यास परिवर्तन और पोर्ट्रेट बल को कैसे रोका जाए?


123

मैं अपने एप्लिकेशन को उसके ओरिएंटेशन को बदलने से रोकना चाहूंगा और लेआउट को "पोर्ट्रेट" से चिपके रहने के लिए मजबूर करूंगा।

Main.dart में, मैंने डाला:

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

लेकिन जब मैं एंड्रॉइड सिम्युलेटर रोटेट बटन का उपयोग करता हूं, तो लेआउट नए डिवाइस ओरिएंटेशन "का अनुसरण करता है ..."

मैं इसे कैसे हल कर सकता हूं?

धन्यवाद


4
मान लिया कि आपने आयात किया है 'package:flutter/services.dart', तो हो सकता है कि यह एक बग हो: github.com/flutter/flutter/issues/13238
ब्रायन कुंग

यकीन नहीं होता कि आपके साथ ऐसा क्यों होता है। मैंने एक एमुलेटर पर अपना कोड चलाने की कोशिश की और मेरा अपना डिवाइस भी है और यह ठीक काम करता है।
हेमंत राज

SystemChrome.setPreferredOrientationsएसिंक्रोनस रूप से रिटर्न, इसलिए ऐसा लगता है जैसे runAppएक में संलग्न होना चाहिए then
केन

जवाबों:


189

आयात package:flutter/services.dart , तब

SystemChrome.setPreferredOrientationsअंदर रखोWidget build()विधि ।

उदाहरण:

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

अपडेट करें

यह समाधान कुछ IOS उपकरणों के लिए काम नहीं कर सकता है, जैसा कि अक्टूबर 2019 में अद्यतन स्पंदन प्रलेखन में उल्लेख किया गया है।

वे इस तरह Info.plist में UISupportedInterfaceOrientations सेट करके अभिविन्यास तय करने की सलाह देते हैं

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

अधिक जानकारी के लिए https://github.com/flutter/flutter/issues/27235#issuecomment-508995063


काम किया। धन्यवाद <3
सुथुरा सुधर्का

1
यदि आप SystemChrome.setPreferredOrientations को मुख्य रूप से रखते हैं, तो आपको त्रुटि मिल जाएगी: ServicesBinding.defaultBinaryMessenger को प्रारंभ होने से पहले एक्सेस किया गया था। बिल्ड कार्यों में कोड सम्मिलित करना क्योंकि इस बिंदु पर बाइंडिंग को आरंभ किया गया है।
गोल्डन लॉयन

76

@boeledi, यदि आप डिवाइस ओरिएंटेशन को "लॉक" करना चाहते हैं और इसे बदलने की अनुमति नहीं देते हैं क्योंकि उपयोगकर्ता अपने फोन को घुमाता है, तो यह आसानी से नीचे सेट किया गया था,

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

आपको तब तक इंतजार करना होगा जब तक setPreferredOrientationsकि काम पूरा न हो जाए और फिर ऐप शुरू कर दें

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

यह कभी-कभी संकलन करते समय एक त्रुटि फेंकता है, आपको देशी समाधान का उपयोग करना चाहिए। एंड्रायड पर मेनएक्टिविटी के लिए 'एंड्रॉइड: स्क्रीनऑरिएशन = "पोर्ट्रेट" को जोड़ना, अबीर इकबाल के सुझाव के अनुसार एंड्रॉइड पर मेरे लिए काम किया।
टिनचो 8२५

44

iOS:

कॉलिंग SystemChrome.setPreferredOrientations()मेरे लिए काम नहीं करता है, और मुझे निम्नलिखित के रूप Device Orientationमें Xcode प्रोजेक्ट में बदलना पड़ा :

यहां छवि विवरण दर्ज करें

एंड्रॉयड:

निम्नलिखित के रूप में फ़ाइल में मुख्य गतिविधि के लिए screenOrientationविशेषता सेट करें :portraitandroid/app/src/main/AndroidManifest.xml

यहां छवि विवरण दर्ज करें


मुझे एक ही समस्या थी, क्या आपने इसे iPad पर चलाया था? मैंने केवल एक iPad पर परीक्षण किया है और यह एक मुद्दा लगता है: github.com/flutter/flutter/issues/27235
लड़का

Android: इस विशेषता को एपीआई स्तर 24 में जोड़ा गया था।
ब्लडलॉस

मैं screenOrientationAndroid के लिए एपीआई स्तर 8 के बाद से उपयोग करता हूं । @BloodLoss, मुझे लगता है कि आपने इसे डॉक्स पर पढ़ा है, लेकिन resizeableActivityविशेषता के बारे में । लिंक को फिर से जांचें। ^ ^
एरिक एम। स्प्रेंगेल

22

'SetPreferredOrientations' विधि फ्यूचर ऑब्जेक्ट लौटाती है। प्रलेखन प्रति एक भविष्य कुछ मूल्य का प्रतिनिधित्व करता है जो भविष्य में कहीं उपलब्ध होगा। इसलिए आप तब तक प्रतीक्षा करेंगे जब तक यह उपलब्ध न हो और फिर आवेदन के साथ आगे बढ़ें। इसलिए, 'तब' पद्धति का उपयोग किया जाएगा, जो प्रति परिभाषा, "भविष्य पूरा होने पर कॉलबैक को पंजीकृत करने के लिए" कहता है। इसलिए, आप इस कोड का उपयोग करेंगे:

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

साथ ही, निम्न फ़ाइल आयात की जानी चाहिए:

'पैकेज: स्पंदन / services.dart'


मैं इस काम की पुष्टि कर सकता हूं। लेकिन तब का उपयोग करें जब () के बजाय तब (), जब फ़ंक्शन को कोई परम नहीं मिला।
Csaba Gergely

20

Android / app / src / main / AndroidManifest.xml खोलें और मेनएक्टिविटी में निम्न पंक्ति जोड़ें:

android:screenOrientation="portrait"

यदि आपके पास यह है:

<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">

आपको कुछ इस तरह से समाप्त करना चाहिए:

<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">

यह एंड्रॉइड के लिए काम करता है। IOS पर, आपको इसे Xcode पृष्ठ से बदलना होगा: https://i.stack.imgur.com/hswoe.png (जैसा कि हज्जाजी ने कहा)


धन्यवाद, विन्यास "ओरिएंटेशन" के बाद "पोर्ट्रेट" के क्रम को याद रखता है।
MR_AMDEV

13

सबसे पहले main.dart फाइल में इसे इम्पोर्ट करें

import 'package:flutter/services.dart';

तब कॉपी पेस्टकरें बल्कि देखें (याद रखें) और मेन कोड फ़ाइल में नीचे कोड लिखें

पोर्ट्रेट मोड में मजबूर करने के लिए :

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

परिदृश्य मोड में मजबूर करने के लिए :

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

1
लोगों को आँख बंद करके कॉपी-पेस्ट न करने की याद दिलाने के लिए धन्यवाद
रायन

1
मैं देख रहा हूं कि आपने पेस्ट की नकल क्यों नहीं की ... अंतिम
छोर

स्पंदन के लिए काम नहीं किया
गोल्डन लायन

13

WidgetsFlutterBinding.ensureInitialized () लगाएं और निर्माण के दौरान आपको एक त्रुटि मिलेगी।

import 'package:flutter/services.dart';

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

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

          runApp(MainApp())
        };

5

setPreferredOrientationएक रिटर्न देता है Future<void>, इसलिए यह अतुल्यकालिक है। सबसे पठनीय तरीका mainअतुल्यकालिक के रूप में परिभाषित करना है :

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

3
मैं दृढ़ता से असहमत हूँ। awaitएक सर्वव्यापी प्रोग्रामिंग पैटर्न है जो कई भाषाओं में मौजूद है, और यह बहुत स्पष्ट है कि क्या स्पष्ट है। thenघोंसले के शिकार का स्तर बनाता है। यदि आपके पास तीन या चार निरंतरता हैं, तो thenवास्तव में पढ़ना बहुत मुश्किल हो जाता है।
रोब लिंडन

.thenघोंसले के शिकार के बजाय जंजीर हो सकती है, क्योंकि यह उम्मीद करता है कि ए FutureOr। यह मुझे अधिक कार्यात्मक दृष्टिकोण का उपयोग करने की अनुमति देता है, जो अधिक पठनीय और सुरुचिपूर्ण है। उदाहरण के लिए, मैं "thens" का पीछा करके ब्रैकेटेड बॉडी के बजाय एक्सप्रेशन बॉडी का उपयोग कर सकता हूं।
मेटुस फेलिप

यह कभी-कभी संकलन करते समय एक त्रुटि फेंकता है, आपको देशी समाधान का उपयोग करना चाहिए। एंड्रायड पर मेनएक्टिविटी के लिए 'एंड्रॉइड: स्क्रीनऑरिएशन = "पोर्ट्रेट" को जोड़ना, अबीर इकबाल के सुझाव के अनुसार एंड्रॉइड पर मेरे लिए काम किया।
तिनचो 8२५

यदि आपको एक त्रुटि का सामना करना पड़ रहा है: "बंधन समाप्त होने से पहले Unhandled Exception: ServicesBinding.defaultBinaryMessenger एक्सेस किया गया था।" इस फिक्स का उपयोग करने का प्रयास करें: stackoverflow.com/questions/57689492/…
फ़िलिप सिल्वा

1

नए स्पंदन संस्करणों के साथ-साथ preferred Orientationहमें एक अतिरिक्त लाइन जोड़ने की आवश्यकता है

 WidgetsFlutterBinding.ensureInitialized();

तो इसके लिए वर्किंग कोड है -

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

1

नीचे स्पंदन टीम का आधिकारिक उदाहरण है। https://github.com/flutter/samples/blob/master/veggieseasons/lib/main.dart

import 'package:flutter/services.dart' show DeviceOrientation, SystemChrome;

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

0

प्रयत्न

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

आप Android मेनिफ़ेस्ट और ios info.plist फ़ाइल में स्क्रीन ओरिएंटेशन सेटिंग्स भी बदल सकते हैं।


0

आयात आयात 'पैकेज: स्पंदन / services.dart';

फिर आप अपनी main.dart फ़ाइल में और नीचे अपनी मुख्य विधि में कोड की पंक्ति शामिल करें:

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

runApp(myApp());

-4

इसका सबसे अच्छा उपाय यह होगा कि आप इसका उपयोग MyApp () की बिल्ड विधि में करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.