বিড়বিড়: ডিভাইস ওরিয়েন্টেশন পরিবর্তন এবং জোর প্রতিকৃতি কিভাবে প্রতিরোধ করবেন?


153

আমি আমার অ্যাপ্লিকেশনটির ওরিয়েন্টেশন পরিবর্তন হতে বাধা দিতে এবং লেআউটটিকে "প্রতিকৃতি" এ আটকে রাখতে বাধ্য করতে চাই।

মেইন.ডার্টে আমি রেখেছি:

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
কেন

উত্তর:


222

আমদানি করুন 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(...);
    }
  }

হালনাগাদ

এই সমাধানটি আইওএস ডিভাইসের জন্য অক্টোবর 2019-এ আপডেট হওয়া ফ্লটার ডকুমেন্টেশনে উল্লিখিত হিসাবে কাজ করবে না।

তারা ইউআইএসপম্পোর্টড ইন্টারফেস ওরিয়েন্টেশনগুলি ইনফো.প্লেস্টে এইভাবে সেট করে ওরিয়েন্টেশনটি স্থির করার পরামর্শ দেয়

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

আরও তথ্যের জন্য https://github.com/flutter/flutter/issues/27235#issuecomment-508995063


4
আপনি যদি সিস্টেমে ক্রোম.সেটপ্রেফারড ওরিয়েন্টেশনগুলি মূলত রাখেন তবে আপনি ত্রুটিটি পাবেন: বাঁধাই শুরু করার আগে পরিষেবাদিবিডিং.ডফাল্টবাইনারি ম্যাসেঞ্জার অ্যাক্সেস করা হয়েছিল। বিল্ডের কাজগুলিতে কোডটি সন্নিবেশ করা হচ্ছে কারণ এই মুহুর্তে বাইন্ডিংগুলি শুরু করা হয়েছে।
গোল্ডেন সিংহ

83

@ বোলেদী, আপনি যদি ডিভাইস অভিযোজনটি "লক" করতে চান এবং ব্যবহারকারী তাদের ফোনটি ঘোরার সাথে সাথে এটি পরিবর্তন করতে না দেয়, তবে এটি নীচের মত সহজেই সেট করা হয়েছিল,

// 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());
    });
}

4
এটি সংকলনের সময় কখনও কখনও ত্রুটি ছুড়ে দেয়, আপনার স্থানীয় সমাধানগুলি ব্যবহার করা উচিত। আবির ইকবালের পরামর্শ অনুসারে অ্যান্ড্রয়েডে আমার জন্য কাজ করায় অ্যান্ড্রয়েড ম্যানিফেস্টিমে 'অ্যান্ড্রয়েড: স্ক্রিন ওরিয়েন্টেশন = "প্রতিকৃতি"' যুক্ত করা হয়েছে।
টিনচো 825

54

আইওএস:

কল করা SystemChrome.setPreferredOrientations()আমার পক্ষে কাজ করে না এবং আমাকে এক্সকোড প্রকল্পে নিম্নলিখিত হিসাবে পরিবর্তন করতে Device Orientationহয়েছিল :

এখানে চিত্র বর্ণনা লিখুন

অ্যান্ড্রয়েড:

ফাইলের মূল ক্রিয়াকলাপের জন্য নিম্নলিখিত হিসাবে screenOrientationঅ্যাট্রিবিউট সেট করুন :portraitandroid/app/src/main/AndroidManifest.xml

এখানে চিত্র বর্ণনা লিখুন


আমারও একই সমস্যা ছিল, আপনি কি কোনও আইপ্যাডে চালিয়েছেন? আমি কেবল একটি আইপ্যাডে পরীক্ষা করেছি এবং এটি একটি সমস্যা বলে মনে হচ্ছে: github.com/flutter/flutter/issues/27235
ছেলে

অ্যান্ড্রয়েড এই বৈশিষ্ট্য এপিআই স্তর 24 সালে যোগ করা হয়েছিল
BloodLoss

আমি screenOrientationঅ্যান্ড্রয়েডের জন্য এপিআই লেভেল 8 ব্যবহার করি। ব্লুডলস, আমি মনে করি আপনি এটি ডক্সে পড়েছেন তবে resizeableActivityগুণাবলী সম্পর্কে । আবার লিঙ্কটি পরীক্ষা করুন। ^^
এরিক এম স্প্রেঞ্জেল

23

'SetPreferredOrientations' পদ্ধতিটি ফিউচার অবজেক্ট দেয়। ডকুমেন্টেশন প্রতি একটি ভবিষ্যত এমন কিছু মান উপস্থাপন করে যা ভবিষ্যতে কোথাও উপলব্ধ available এজন্য আপনি এটি উপলব্ধ না হওয়া পর্যন্ত অপেক্ষা করুন এবং তারপরে অ্যাপ্লিকেশনটি নিয়ে এগিয়ে চলুন। সুতরাং, সেখানে 'তারপর' পদ্ধতি ব্যবহার করা হবে, যা সংজ্ঞা অনুসারে, "ফিউচারটি সম্পূর্ণ হলে কল কলব্যাকগুলি নিবন্ধিত করে"। সুতরাং, আপনি এই কোডটি ব্যবহার করবেন:

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

এছাড়াও, নিম্নলিখিত ফাইলটি আমদানি করতে হবে:

'প্যাকেজ: বিড়ম্বনা / পরিষেবাদি.ডার্ট'


আমি এই কাজ নিশ্চিত করতে পারি। তবে ততক্ষণে () পরিবর্তে যখন কমপ্লিট () ব্যবহার করুন, যখন ক্রিয়াকলাপটি কোনও পরম পেল না।
সিসাবা জারগেলি

23

Android / অ্যাপ / এসসিআর / প্রধান / অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল খুলুন এবং মেইনঅ্যাক্টিভিটিতে নিম্নলিখিত লাইনটি যুক্ত করুন:

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

এটি অ্যান্ড্রয়েডের জন্য কাজ করে। আইওএস-এ, আপনাকে এটি এক্সকোড পৃষ্ঠা থেকে পরিবর্তন করতে হবে: https://i.stack.imgur.com/hswoe.png (যেমন হেজাজী বলেছেন)


4
ধন্যবাদ, কনফিগারচেনজ "ওরিয়েন্টেশন" এর পরে "প্রতিকৃতি" অর্ডার মনে রাখবেন।
এমআর_এএমডিএভি

14

উইজেটস ফ্লুটারবাইন্ডিং.সেনিউর ইনটাইটেলাইজড () রাখুন অন্যথায় আপনি নির্মাণের সময় ত্রুটি পাবেন।

import 'package:flutter/services.dart';

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

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

          runApp(MainApp())
        };

13

প্রথমে এটিকে মূল.ডার্ট ফাইলটিতে আমদানি করুন

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()),
      );

4
অন্ধভাবে অনুলিপি-পেস্ট না করা লোককে স্মরণ করিয়ে দেওয়ার জন্য আপনাকে ধন্যবাদ
রায়ান

4
আমি কেন আপনি পেস্ট অনুলিপি করতে
বলেননি

5

setPreferredOrientationএকটি প্রদান করে Future<void>, তাই এটি অ্যাসিক্রোনাস। সর্বাধিক পঠনযোগ্য পদ্ধতি হ'ল অ্যাসিনক্রোনাস mainহিসাবে সংজ্ঞায়িত করা:

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

4
আমি দৃ strongly়ভাবে একমত না। awaitএক সর্বব্যাপী প্রোগ্রামিং প্যাটার্ন যা একাধিক ভাষায় উপস্থিত এবং এটি কী স্পষ্ট তা স্পষ্ট। thenবাসা বাঁধার স্তর তৈরি করে। আপনার যদি তিন বা চার ধারাবাহিকতা থাকে thenতবে সত্যিই পড়া খুব কঠিন হয়ে ওঠে।
রব লিন্ডন

.thenবাসা বাঁধার পরিবর্তে শৃঙ্খলাবদ্ধ হতে পারে, যেমন এটি প্রত্যাশা করে a FutureOr। এটি আমাকে আরও কার্যকরী পদ্ধতির ব্যবহার করতে দেয় যা আরও পাঠযোগ্য এবং মার্জিত। উদাহরণস্বরূপ, আমি "থেটস" শৃঙ্খলিত করে বন্ধনীযুক্ত শরীরের পরিবর্তে এক্সপ্রেশন বডি ব্যবহার করতে পারি।
ম্যাটিউস ফিলিপ

সংকলনের সময় এটি কখনও কখনও ত্রুটি ছুড়ে দেয়, আপনার স্থানীয় সমাধানগুলি ব্যবহার করা উচিত। আবির ইকবালের পরামর্শ অনুসারে অ্যান্ড্রয়েডে আমার জন্য কাজ করায় অ্যান্ড্রয়েড ম্যানিফেস্টিমে 'অ্যান্ড্রয়েড: স্ক্রিন ওরিয়েন্টেশন = "প্রতিকৃতি"' যুক্ত করা হয়েছে।
টিনচো 825

যদি আপনি একটি ত্রুটির মুখোমুখি হন: "আনহ্যান্ডলড ব্যতিক্রম: পরিষেবাদি বাঁধাই de এই ফিক্স ব্যবহার করার চেষ্টা করুন: stackoverflow.com/questions/57689492/...
Fillipe সিলভা

4

মূল.ডার্ট ফাইলটিতে নিম্নলিখিত কোডের লাইনটি যুক্ত করুন।

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

এবং পরিষেবাদি.ডার্ট ফাইলটি আমদানি করতে মনে রাখবেন। নীচে একটি উদাহরণ দেওয়া হল!

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!")),
     ),
   );
  }
}

3

নীচে ঝাপটানো দলের সরকারী উদাহরণ দেওয়া হল। https://github.com/flutter/sample/blob/master/veggieseason/lib/main.dart

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

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

2

মানুষের জন্য, তারা এখন এই প্রশ্নটি পড়ছে। সবচেয়ে সহজ উপায় যা আমি খুঁজে পেয়েছি এবং এটি অ্যান্ড্রয়েড এবং আইওএস ডিভাইস উভয় ক্ষেত্রেই কাজ করেছে।

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

1

সেট করার সাথে সাথে নতুন বিড়বিড় সংস্করণ হিসাবে preferred Orientationআমাদের আরও একটি অতিরিক্ত লাইন যুক্ত করা দরকার

 WidgetsFlutterBinding.ensureInitialized();

সুতরাং এর জন্য কার্যকারী কোডটি হ'ল -

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

1

আমদানি করুন 'প্যাকেজ: বিড়ম্বনা / পরিষেবাদি.ডার্ট';

তারপরে আপনি নীচে কোডের লাইনটি আপনার মেইন.ডার্ট ফাইলটিতে এবং আপনার মূল পদ্ধতিতে অন্তর্ভুক্ত করুন:

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

runApp(myApp());


0

চেষ্টা করুন

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

এছাড়াও আপনি অ্যান্ড্রয়েড ম্যানিফেস্ট এবং আইওএস তথ্য.পল্লিস্ট ফাইলটিতে স্ক্রিন ওরিয়েন্টেশন সেটিংস পরিবর্তন করতে পারেন।


0

আপনি যদি xcode ইন্টারফেস থেকে এটি সম্পাদনা করে থাকেন তবে এটি আইপ্যাডের জন্য পরিবর্তন করা হবে না। আইপ্যাড বিভাগের জন্য আপনার অবশ্যই অ্যান্ড্রয়েড স্টুডিও থেকে তথ্য.পলিট ফাইলটি সম্পাদনা করতে হবে। আপনি "ip আইপ্যাড" এর মতো অ্যারে তালিকায় দেখতে পাবেন। তথ্য.পালিস্টে দুটি বিভাগ উপলব্ধ রয়েছে, আপনাকে আইফোন এবং আইপ্যাড উভয়ের জন্য ম্যানুয়ালি এডিট করতে হবে।


0

এই সমাধানটি অ্যান্ড্রয়েডের জন্য দুটি ভিন্ন প্রকল্পে আমার পক্ষে কাজ করেছে। এটি আইওএসের জন্যও কার্যকর হবে কিনা গ্যারান্টি দিতে পারে না। আমি পূর্ববর্তী সমস্ত উত্তরগুলি পড়েছি এবং আমি মনে করি যে এটির মতো করাই সেরা এবং সহজ সমাধান:

অ্যান্ড্রয়েড:

এইভাবে আপনি সমস্ত "অপেক্ষার" গুলি, "অ্যাসিঙ্ক" এবং "তারপরে" এড়িয়ে যান যা আপনার কোডের সাথে গোলমাল করতে পারে

/// this is in main.dart

main(){
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    MaterialApp(
      initialRoute: '/root',
      routes: {
        '/root': (context) => MyApp(),
      },
      title: "Your App Title",
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    /// ENFORCE DEVICE ORIENTATION PORTRAIT ONLY
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown
    ]);

    /// RUN THE APP
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

আইওএস:

আমি মনে করি এই উত্তরটির আপডেটটি আইওএসের জন্য আপনার সেরা বাজি।

!! অস্বীকৃতি !! আমি গবেষণার একটি সামান্য বিট করেনি এবং দৃশ্যত, ডকুমেন্টেশন এখানে বিশেষভাবে বলেছেন:

setPreferredOrientations method Limitations:

"This setting will only be respected on iPad if multitasking is disabled."

আপনি এখানে এক্সকোড থেকে মাল্টিটাস্কিং (একে পূর্ণাঙ্গ পর্দার প্রয়োজন "বিকল্পটি চালু করুন) অক্ষম করতে পারবেন is

আইওএসের জন্য আর একটি সম্ভাব্য সমাধান

এছাড়াও আপনি চেষ্টা করতে পারে এই এক আউট। আমার ব্যক্তিগতভাবে এটি চেষ্টা করা হয়নি, যেহেতু আমার পিসিতে আমার কাছে আইপ্যাড বা এক্সকোড নেই, তবে এটি শট করার জন্য মূল্যবান


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.