본문 바로가기
버킷리스트/앱 만들기

오공완 (with Do it! 플러터 앱 프로그램밍) #12_1

by 또또도전 2024. 5. 15.
반응형

// 이곳에 쓴 내용은 앱 만들기라는 버킷리스트를 달성하기 위해 플러터를 공부하면서 정리하고 있는 내용입니다.

플러터에 대해 아는 것이 거의 없기 때문에 정리하면서 오류가 있을 수 있습니다.

오류를 발견하신 분은 댓글 남겨 주시면 감사하겠습니다.

 

   안드로이드 네이티브와 통신하기

 

네이티브와 왜 통신을 해야 하는지 모르겠고, 내가 이 기능을 사용하게 될지는 모르겠으나 일단, 코트 타자 연습을 해보도록 하자.

 

-main.dart-

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'dart:io';
import 'package:flutter/services.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    if (Platform.isIOS) {
      return const CupertinoApp(
        home: CupertinoNativeApp(),
      );
    } else {
      return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: const NativeApp(),
      );
    }
  }
}

class CupertinoNativeApp extends StatefulWidget {
  const CupertinoNativeApp({super.key});

  @override
  State<StatefulWidget> createState() {
    return _CupertinoNative();
  }
}

class _CupertinoNative extends State<CupertinoNativeApp> {
  @override
  Widget build(BuildContext context) {
    return const Scaffold();
  }
}

class NativeApp extends StatefulWidget {
  const NativeApp({super.key});

  @override
  State<StatefulWidget> createState() => _NativeAppState();
}

class _NativeAppState extends State<NativeApp> {
  String _deviceInfo = '';
  static const platform = MethodChannel('com.flutter.dev/info');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Native 통신 예제'),
      ),
      body: Center(
        child: Text(
          _deviceInfo,
          style: const TextStyle(fontSize: 30),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _getDeviceInfo();
        },
        child: const Icon(Icons.get_app),
      ),
    );
  }

  Future<void> _getDeviceInfo() async {
    String batteryLevel;
    try {
      final String result = await platform.invokeMethod('getDiviceInfo');
      batteryLevel = 'Device info : $result';
    } on PlatformException catch (e) {
      batteryLevel = "Failed to get Device info: '$e.message}'.";
    }
    setState(() {
      _deviceInfo = batteryLevel;
    });
  }
}

 

잘못된 점 없는 거 같은데 이렇게 뜬다.

큰 따옴표 안에 비워 놔서 그런가.. 책에서는 unknown info라는 메세지가 있었다.

파일-오픈에서 내가 만든 프로젝트 명 아래에 있는 안드로이드를 새로운 창에 실행시키란다. 한참을 여러 과정을 거친다. 책에서 그래들 어쩌고 하던데, gradle:~ 이런 메시지로 계속 작업을 한다. 꽤 오랜 시간을 거친다.

 

그런 다음 app/java/com.exaple.내가 만든 프로젝트명/MainActivity파일을 선택하라는데, 나는 BuildConfig밖에 없다. 코틀린 파일이라는데, java 파일이다. 잘 찾아보니 내 경우

app/kotlin+java/com.exaple.내가 만든 프로젝트명/MainActivity파일이었다.

 

-MainActivity.kt-

package com.example.doit12

import android.os.Build
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 = "com.flutter.dev/info"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
            .setMethodCallHandler { call, result->
                if (call.method == "getDeviceInfo") {
                    val deviceInfo = getDeviceInfo()
                    result.success(deviceInfo)
                }
            }
    }

    private fun getDeviceInfo(): String {
        val sb = StringBuffer()
        sb.append(Build.DEVICE + "\n")
        sb.append(Build.BRAND + "\n")
        sb.append(Build.MODEL + "\n")
        return sb.toString()
    }
}

또 다시 만나는 에러 코드

 

깃허브의 코드를 따라하고 싶은데 뭘 따라 해야 할지 모르겠다.

깃허브 메인 코드를 붙여 넣기해서 같은 결과라서 내 타이핑은 잘 된 것으로..^^;;

MainActivity.kt여기 코드는 붙여 넣기 안 해 봤다. 책에서보다 더 많은 내용이 있는 거 보면 이건 다른 내용이 포함되어 있는 거 같기에.. 이번 장은 여기서 마무리하기로..

반응형