[Flutter] Flutter MethodChannel

GONGยท2023๋…„ 7์›” 26์ผ

Flutter

๋ชฉ๋ก ๋ณด๊ธฐ
3/5
post-thumbnail

Flutter Method Channel์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ , ๊ฐ„๋‹จํ•œ ๋ฐฐํ„ฐ๋ฆฌ ์ถœ๋ ฅ ์˜ˆ์ œ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ํ˜„์žฌ ๋ฐฐํ„ฐ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ฐ›์•„์™€ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Flutter Method Channel

  • Flutter์™€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋žซํผ ๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ โ†’ Flutter์™€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋žซํผ ๊ฐ„์— ๋ฐ์ดํ„ฐ ๋ฐ ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉ๋จ

๊ตฌ์กฐ

  1. Flutter์—์„œ Method Channel์„ ์ƒ์„ฑํ•˜๊ณ  ๋“ฑ๋ก
  2. Flutter์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰
  3. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ Flutter์— ๋ฐ˜ํ™˜
  4. Flutter๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰



๋ฐฐํ„ฐ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ ์˜ˆ์ œ

๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ํ˜„์žฌ ๋ฐฐํ„ฐ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ฐ›์•„์™€ ํ™”๋ฉด์— ์ถœ๋ ฅ

  1. Flutter์—์„œ Method Channel ์„ค์ •
    main.dart

    import 'package:flutter/services.dart';
    
    ...
    
    static const platform = MethodChannel('com.example.test_flutter');

  1. ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ Method Channel ์„ค์ •, ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ

    MainActivity.kt

    private val CHANNEL = "com.example.test_flutter"
    
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
    
        // Method Channel ๋“ฑ๋ก
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getBatteryLevel") {
                val batteryLevel = getBatteryLevel() // ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜์ค€ ์–ป๊ธฐ
                if (batteryLevel != -1) {
                    result.success(batteryLevel)
                } else {
                    result.error("UNAVAILABLE", "Battery level not available.", null)
                }
            } else {
                result.notImplemented()
            }
        }
    }
    
    private fun getBatteryLevel(): Int {
        var batteryLevel = -1
        val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
        batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    
        return batteryLevel
    }

  1. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

    main.dart

    // ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
    Future<String> getBatteryLevel() async {
      try {
    		// ์œ„์—์„œ ์ƒ์„ฑํ•œ ์ฑ„๋„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด invokeMethod ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ
    		// ์ด๋•Œ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜ธ์ถœํ•  ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅ
        final int result = await platform.invokeMethod('getBatteryLevel');
        return '๋ฐฐํ„ฐ๋ฆฌ: $result%';
      } on PlatformException catch (e) {
        return '์‹คํŒจ: ${e.message}';
      }
    }

  1. ์‹คํ–‰ ๊ฒฐ๊ณผ



์ „์ฒด ์ฝ”๋“œ

  • main.dart
    import 'dart:developer';
    
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      
      Widget build(BuildContext context) {
        return MaterialApp(
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      const MyHomePage({Key? key}) : super(key: key);
    
      // Method Channel ์ƒ์„ฑ
      static const platform = MethodChannel('com.example.test_flutter');
    
      // ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
      Future<String> getBatteryLevel() async {
        try {
    			// ์œ„์—์„œ ์ƒ์„ฑํ•œ ์ฑ„๋„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด invokeMethod ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ
    			// ์ด๋•Œ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜ธ์ถœํ•  ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅ
          final int result = await platform.invokeMethod('getBatteryLevel');
          return '๋ฐฐํ„ฐ๋ฆฌ: $result%';
        } on PlatformException catch (e) {
          return '์‹คํŒจ: ${e.message}';
        }
      }
    
      
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Method Channel Test"),
          ),
          body: Center(
            child: FutureBuilder(
              future: getBatteryLevel(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return Text(snapshot.data!);
                }
                return CircularProgressIndicator();
              },
            ),
          ),
        );
      }
    }
  • MainActivity.kt
    package com.example.test_flutter
    
    import android.content.Context
    import android.os.BatteryManager
    import android.os.Build
    import androidx.annotation.RequiresApi
    import io.flutter.embedding.android.FlutterActivity
    import io.flutter.embedding.engine.FlutterEngine
    import io.flutter.plugin.common.MethodChannel
    import io.flutter.plugins.GeneratedPluginRegistrant
    
    class MainActivity: FlutterActivity() {
        private val CHANNEL = "com.example.test_flutter"
    
        override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
            GeneratedPluginRegistrant.registerWith(flutterEngine)
    
            // Method Channel ๋“ฑ๋ก
            MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
                if (call.method == "getBatteryLevel") {
                    val batteryLevel = getBatteryLevel() // ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜์ค€ ์–ป๊ธฐ
                    if (batteryLevel != -1) {
                        result.success(batteryLevel)
                    } else {
                        result.error("UNAVAILABLE", "Battery level not available.", null)
                    }
                } else {
                    result.notImplemented()
                }
            }
        }
    
        private fun getBatteryLevel(): Int {
            var batteryLevel = -1
            val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
            batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    
            return batteryLevel
        }
    }


์ฐธ๊ณ 

(android studio ๊ธฐ์ค€)

  • flutter ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ”๋กœ android > app > main > kotlin > ํ”„๋กœ์ ํŠธ ํŒจํ‚ค์ง€๋ช… > MainActivity.kt ํŒŒ์ผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋นจ๊ฐ„์ค„ ๋ฒ”๋ฒ…
  • android studio ์ตœ์ƒ๋‹จ File > open > ํ˜„์žฌ ์ž‘์—…ํ•˜๋Š” ํ”„๋กœ์ ํŠธ > android ๋กœ android ํด๋”๋ฅผ ์ƒˆ ์ฐฝ์— ์—ด์–ด์„œ kotlin ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋นจ๊ฐ„์ค„ ์•ˆ๋ณด์ž…๋‹ˆ๋‹ค

profile
์šฐ์™€์žฌ๋ฐ‹๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€