Экран проверки флаттера круглый на Android

Есть ли способ проверить округлость экрана устройства с помощью Flutter?

После некоторого поиска я только нашел, как это сделать, используя собственный код: https://developer.android.com/reference/android/content/res/Configuration?hl=es#isScreenRound() .

На самом деле он мне нужен только для Android, но я не нашел, как это сделать с помощью Flutter. Я хочу использовать эту информацию, чтобы немного изменить макет приложения.

1 ответ

Для этого вам нужно будет использовать каналы платформы .

Внутри configureFlutterEngine() , создается MethodChannel, который вызывает setMethodCallHandler(). Затем проверяется фактический метод и вызывается собственный код Android, чтобы проверить, округлен ли экран.

Вот код, демонстрирующий это.

В твоей MainActivity.kt, у вас должно получиться следующее:

          package your.package.name
    
    import android.content.res.Configuration
    import androidx.annotation.NonNull
    import io.flutter.embedding.android.FlutterActivity
    import io.flutter.embedding.engine.FlutterEngine
    import io.flutter.plugin.common.MethodChannel
    
    class MainActivity : FlutterActivity() {
        private val CHANNEL = "leonardosilva.com/screen-roundness"
    
        override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
            super.configureFlutterEngine(flutterEngine)
            MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call,
                                                                                                      result ->
                if (call.method == "getScreenRoundness") {
                    val config: Configuration = resources.configuration
    
                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                        result.success(config.isScreenRound)
                    } else {
                        result.notImplemented()
                    }
                } else {
                    result.notImplemented()
                }
            }
        }
       
    }

И в вашем коде Flutter вам понадобится переменная, которая содержит ссылку на канал платформы, поэтому в вашем Stateful Widgetс State class, у вас может быть это:

          static const platform =
          const MethodChannel('leonardosilva.com/screen-roundness');

а затем у вас может быть метод, подобный приведенному ниже, который вызывает метод на собственной стороне:

          Future<void> _checkIfScreenIsRounded() async {
        try {
          final bool result = await platform.invokeMethod('getScreenRoundness');
          setState(() {
            _isScreenRound = result;
          });
        } on PlatformException catch (e) {
          print('Error $e');
        }
      }

Вот пример, который вы можете вставить в свой main.dart и запустите:

          import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      static const platform =
          const MethodChannel('leonardosilva.com/screen-roundness');
    
      bool _isScreenRound;
    
      bool _isLoading;
    
      @override
      void initState() {
        super.initState();
        _isLoading = false;
      }
    
      Future<void> _checkIfScreenIsRounded() async {
        try {
          final bool result = await platform.invokeMethod('getScreenRoundness');
          print(result);
          setState(() {
            _isScreenRound = result;
          });
        } on PlatformException catch (e) {
          print('Error $e');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: _isLoading
                ? CircularProgressIndicator()
                : Text(
                    _isScreenRound == null
                        ? 'Press button to check if screen is rounded'
                        : _isScreenRound
                            ? 'Screen is round'
                            : 'Screen is not round',
                  ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _checkIfScreenIsRounded,
            tooltip: 'Check if screen is round',
            child: Icon(Icons.add),
          ),
        );
      }
    }
Другие вопросы по тегам