Как настроить яркость системы во Flutter: несколько методов с примерами кода

Чтобы настроить яркость системы в приложении Flutter, вы можете использовать код, специфичный для платформы, для взаимодействия с базовыми собственными API. Вот несколько методов с примерами кода:

Метод 1: использование пакета screen_brightness.
В этом методе используется пакет screen_brightness, который предоставляет кроссплатформенное решение для настройки яркости экрана во Flutter.

Метод 1. Использование пакета screen_brightness.р>

Сначала добавьте пакет screen_brightnessв файл pubspec.yaml:

dependencies:
  screen_brightness: ^1.0.0

Затем вы можете использовать методы пакета для регулировки яркости. Вот пример:

import 'package:flutter/material.dart';
import 'package:screen_brightness/screen_brightness.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Adjust Brightness'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // Get the current brightness
                  double currentBrightness = await ScreenBrightness.current;
                  // Set the brightness to a desired value (0.0 to 1.0)
                  await ScreenBrightness.setScreenBrightness(0.5);
                },
                child: Text('Adjust Brightness'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Не забудьте импортировать необходимые пакеты и запустить flutter pub get, чтобы загрузить их.

Метод 2. Использование каналов платформы.
Этот метод предполагает использование каналов платформы для взаимодействия с собственным кодом. Это требует настройки кода, специфичного для каждой поддерживаемой платформы.

Сначала определите интерфейс платформы в Dart:

import 'package:flutter/services.dart';
class SystemBrightness {
  static const MethodChannel _channel =
      MethodChannel('system_brightness');
  static Future<double> getCurrentBrightness() async {
    final brightness =
        await _channel.invokeMethod<double>('getCurrentBrightness');
    return brightness ?? 1.0;
  }
  static Future<void> setBrightness(double brightness) async {
    await _channel.invokeMethod<void>('setBrightness', brightness);
  }
}

Затем реализуйте код, специфичный для каждой платформы (Android и iOS), используя соответствующие собственные API.

Для Android:
Создайте новый файл Kotlin (SystemBrightnessPlugin.kt) и добавьте следующий код:

package com.example.system_brightness
import android.content.ContentResolver
import android.content.Context
import android.provider.Settings
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.PluginRegistry.Registrar
class SystemBrightnessPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
    private lateinit var context: Context
    private lateinit var channel: MethodChannel
    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        context = binding.applicationContext
        channel = MethodChannel(binding.binaryMessenger, "system_brightness")
        channel.setMethodCallHandler(this)
    }
    companion object {
        @JvmStatic
        fun registerWith(registrar: Registrar) {
            val channel = MethodChannel(registrar.messenger(), "system_brightness")
            val plugin = SystemBrightnessPlugin()
            plugin.context = registrar.context()
            channel.setMethodCallHandler(plugin)
        }
    }
    override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        channel.setMethodCallHandler(null)
    }
    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        when (call.method) {
            "getCurrentBrightness" -> result.success(getCurrentBrightness())
            "setBrightness" -> {
                val brightness = call.arguments as Double
                setBrightness(brightness)
                result.success(null)
            }
            else -> result.notImplemented()
        }
    }
    private fun getCurrentBrightness(): Double {
        return try {
            val resolver: ContentResolver = context.contentResolver
            val brightness = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS)
            brightness / 255.0
        } catch (e: Exception) {
            1.0
        }
    }
    private fun setBrightness(brightness: Double) {
        try {
            val brightnessValue = (brightness * 255).toInt()
            val resolver: ContentResolver = context.contentResolver
            Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, brightnessValue)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

Для iOS:
Создайте новый файл Swift (SystemBrightnessPlugin.swift) и добавьте следующий код:

import Flutter
import UIKit
public class SystemBrightnessPlugin: NSObject, FlutterPlugin {
    public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "system_brightness", binaryMessenger: registrar.messenger())
       let instance = SystemBrightnessPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }

    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "getCurrentBrightness":
            result(getCurrentBrightness())
        case "setBrightness":
            if let brightness = call.arguments as? Double {
                setBrightness(brightness: brightness)
            }
            result(nil)
        default:
            result(FlutterMethodNotImplemented)
        }
    }

    private func getCurrentBrightness() -> Double {
        return Float(UIScreen.main.brightness)
    }

    private func setBrightness(brightness: Double) {
        UIScreen.main.brightness = CGFloat(brightness)
    }
}

В коде Dart используйте класс SystemBrightnessдля регулировки яркости:

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(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Adjust Brightness'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // Get the current brightness
                  double currentBrightness =
                      await SystemBrightness.getCurrentBrightness();
                  print('Current Brightness: $currentBrightness');
                  // Set the brightness to a desired value (0.0 to 1.0)
                  SystemBrightness.setBrightness(0.5);
                },
                child: Text('Adjust Brightness'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Обязательно включите необходимые операторы импорта и запустите flutter pub get, чтобы загрузить необходимые пакеты.