Flutter의 알림 및 알람

Flutter 플러그인, Android_Alarm_Manager 작업.

이것을 알아라! 이 플러그인은 Android 플랫폼 에서만 작동 합니다! 나는 개인적으로 iOS에 상응하는 것을 모른다. 또는이 기사를 게시 한 지 한 달 후 Android 및 iOS 플랫폼 모두에서 알림을 제공하는 플러그인을 찾았습니다. 물론 나는 기사를 썼다. 아래를 참조하십시오.

Flutter의 알림

여기에 설명 된 플러그인을 사용하려면 readme 파일을 명시 적으로 따라야 올바르게 설정해야합니다. AndroidManfest.xml은 최소한 아래와 같은 모습이어야합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="NAME OF YOUR APPLICATION STARTING WITH COM.">
<!-- The INTERNET permission access.-->
    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- android_alarm_manager -->
    <!-- Start an Alarm When the Device Boots if past due -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!-- application needs to have the device stay on -->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
        android:name="io.flutter.app.FlutterApplication"
        android:label="code_samples"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <meta-data
              android:name="io.flutter.embedding.android.SplashScreenDrawable"
              android:resource="@drawable/launch_background"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <!-- android_alarm_manager -->
        <service
                android:name="io.flutter.plugins.androidalarmmanager.AlarmService"
                android:permission="android.permission.BIND_JOB_SERVICE"
                android:exported="false"/>
        <receiver
                android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver"
                android:exported="false"/>
        <receiver
                android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver"
                android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

# https://pub.dev/packages/android_alarm_manager
android_alarm_manager: ^0.4.0

이 경우 앱에서 알람을 설정하기위한 것입니다! 제 경우에는 Flutter 플러그인 android_alarm_manager를 찾았고 제가 작업하던 최근 앱의 요구 사항을 충족 시켰습니다. 그래서… 쉽게 작업 할 수있는 루틴을 만들었습니다. 원하는 경우 사본을 가져와 나만의 것으로 만들고 개선 사항을 공유하십시오. 멋있는?

이제 시간이 있으시다면이 플러그인이 거의 '완벽한'작동을 위해해야했던 작업을 계속 읽어 주시면 알람이나 다른 작업이 어느 시점에서 '백그라운드에서'수행되도록 쉽고 빠르게 설정할 수 있습니다. 앱이 실행되는 동안 미래에. 그것은 삶을 조금 더 쉽게 만들어주고 그것은 좋은 것입니다. 권리?

스크린 샷 만. 요점을 클릭하십시오.

항상 그렇듯이 글에 코드를 표시하기 위해 요점보다 스크린 샷을 사용하는 것을 선호합니다. 작업하기 쉽고 읽기 쉽습니다. 그러나 요점 또는 Github에서 코드를 보려면 클릭 / 탭할 수 있습니다. 아이러니하게도 휴대폰보다 컴퓨터에서 모바일 개발에 대한이 기사를 읽는 것이 좋습니다. 게다가 우리는 주로 컴퓨터에서 프로그래밍합니다. 우리 전화가 아닙니다. 지금은.

의 시작하자.

Greg Perry의 기타 이야기

여기서의 접근 방식은 먼저이 유틸리티 클래스를 예제로 제시하고 사용 방법을 보여줍니다. 따라서 Flutter 플러그인 인 android_alarm_manager를 활용 합니다. 사실 플러그인의 자체 예제 페이지에 나열된 것과 동일한 예제를 사용하겠습니다 . 그러나이 예제는 여기에 제시된 라이브러리 파일을 대신 활용하도록 수정되었습니다. 이 예제의 사본은 gist 인 android_alarm_manager 로 사용할 수 있습니다 . 예제가 끝나면 유틸리티 클래스 자체의 일부를 살펴보면서 이러한 클래스를 일반 대중이 사용하도록 허용하기 위해 수행해야하는 작업을 설명합니다.

정적 유지

이 매우 간단한 예에서 표시된 버튼을 누르면 5 초 후에 아래 스크린 샷에 표시된 두 개의 0이 1로 바뀝니다. 헉! 물론 정말 흥미로운 것은 코드의 내부에있는 것입니다.

앱이 실제로 실행되기 전에 수행해야하는 비동기 작업을 수용하기 위해 원본 코드를 변경했습니다. 이를 위해 FutureBuilder 위젯을 사용했습니다. 이 과정 에서 위의 스크린 샷에서 볼 수 있듯이 발생한 총 알람 수를 '기억'하는 데 사용되는 '공유 기본 설정'루틴을 초기화하기 위해 initSettings () 라는 새 함수를 정의했습니다 .

android_alarm_manager.dart

아래에 표시된 initSettings () 함수에서도 앱이 처음 실행 된 경우 '총 개수'를 0으로 설정하는 것을 볼 수 있습니다 . 그러나 시작 단계에서 라이브러리 루틴 인 AlarmManager 가 초기화되어 Android 휴대폰에서 알림을 수행하는 데 필요한 특정 '알람 서비스'를 설정합니다.

android_alarm_manager.dart

예제 코드를 더 자세히 살펴보고 그 작은 버튼을 구성하는 요소를 살펴 보겠습니다. 라이브러리 루틴은 밑줄을 긋는 Flutter 플러그인 Android_Alarm_Manager 를 구성하는 매개 변수와 함수에 매우 동일한 이름을 사용합니다 . 그런 것들과 일치하는 것이 좋습니다. 또한 플러그인의 자체 oneShot () 함수 와 매우 유사 하게이 라이브러리의 버전은 일단 호출되면 지정된 콜백 루틴을 실행하기 전에 지정된 기간 동안 '대기'합니다. 이 수정 된 예제의 경우 콜백 루틴은 5 초 후에 실행되는 익명 함수입니다. 아래 스크린 샷에서 실제로 앱이 다시 시작되면서 버튼이 다시 눌려 졌는데, 이는 공유 기본 설정 덕분에 버튼이 처음 실행 된 이후 두 번 눌 렸음을 나타냅니다. 헉.

android_alarm_manager.dart

아래의 익명 함수를 자세히 살펴보면 정수 유형의 단일 매개 변수가 전달되는 것을 볼 수 있습니다. Dart 함수 Random (). nextInt (pow (2,31))을 사용하여 두 번째 매개 변수에 난수로 전달 된 것과 매우 동일한 id 값을 추측 할 수 있습니다 . 이제 바로 옆의 매개 변수에 이미 전달 된 값을 전달해야하는 이유는 무엇입니까? 우리는 그것을 얻을 것입니다.

지금은 콜백 함수가 차례로 _incrementCounter () 함수를 호출한다는 것을 아래에서 자세히 볼 수 있습니다 . 여기에서 버튼 누름의 현재 '총 개수'는 '공유 기본 설정'루틴에서 검색됩니다. 그런 다음 현재 버튼 누름을 고려하여 업데이트되고 공유 기본 설정에 다시 저장됩니다. 그런 다음 setState () 함수를 사용하여 증분 변수 _counter로 앱 화면을 업데이트합니다 . 지금까지 그 모든 것을 따랐습니까?

android_alarm_manager.dart

정적 유지

원래 예제 (아래 참조)와 달리이 예제는 익명 함수를 사용할 수 있으며 특별히 정적 함수를 사용할 필요는 없습니다. 물론,이 예제에서도 정적 함수를 사용할 수 있습니다.이 유일한 정수 값을 여전히 받아들이는 한. 그러나 원래 예제에서는 정적 함수이거나 해당 라이브러리 Dart 파일의 클래스 외부에 정의 된 고수준 함수 여야합니다. 두 가지 모두 Flutter 플러그인 인 Android_Alarm_Manager로 직접 작업 할 때 요구 사항 입니다.

그러나 내 기사를 팔로우했다면 내가 옵션을 좋아한다는 것을 알 수 있습니다. 나와 함께 옵션을 갖는 것이 전부입니다. 예를 들어 익명 함수를 허용하기 위해이 유틸리티 클래스를 좀 더 수용 적으로 작성했습니다. 따라서 이러한 배열에서 해당 id 정수 값을 매개 변수로 전달하면 실제로 함수가 정적 함수, 고수준 함수 또는 익명 함수가 될 수 있습니다. 옵션! 다시 원래 예제의 스크린 샷은 다음과 같습니다.

유틸리티 클래스 인 AlarmManager 자체 를 살펴 보겠습니다 . 다시 말하지만 플러그인과 함께 작동하도록 설계되었습니다. 또한 많은 매개 변수가 플러그인에서 사용하는 것과 동일한 매개 변수이므로 해당 플러그인에 전달되지만 유효한 값에 대한 광범위한 매개 변수 테스트 전에는 전달되지 않습니다. 그러한 유틸리티 클래스의 또 다른 필수 특성. 모든 작업을 수행하므로 그럴 필요가 없습니다. 권리?

아래 스크린 샷에서이 유틸리티 클래스의 첫 번째 부분입니다. 정적 함수 인 init ()에서 플러그인이 실제로 초기화되었음을 알 수 있습니다. 초기화를 시도 할 때 발생할 수있는 모든 불행한 오류는 try-catch에서 포착 됩니다. 유틸리티 클래스도 그렇게해야합니다. 다음으로 init () 함수에는 'helper'클래스 인 _Callback이 있습니다 .이 클래스 는 앱 이 백그라운드에서 알람 서비스에서 사용 하는 별도의 Isolate 와 통신하는 데 필요한 수단을 초기화하기 위해 호출됩니다 .

마지막으로, 널이 ​​아닌 모든 매개 변수 값이 유틸리티 클래스 인 AlarmManager 를 구성하는 특정 속성과 정적 속성에 할당되어 있음을 아래에서 볼 수 있습니다 . 여기에서 일어나는 많은 정적이 없습니다.

alarm_manager.dart

이 클래스를 구성하는 많은 속성과 함수가 정적이라는 것을 알 수 있습니다. 그러나 클래스에서 정적 멤버를 사용하는 선택은 적절해야합니다. 예를 들어, init () 함수가 Static이기 때문에 언제 어디서나 여러 번 호출 할 수 있습니다. 그 사실에는 몇 가지 추가 고려가 필요합니다. 이 경우 위 스크린 샷의 첫 번째 한 줄 문은 if 문입니다 : 'i f (_init) return _init;'. init () 함수를 작성할 때 필요했습니다 . 이를 통해 이제 원하는만큼 해당 함수를 호출 할 수 있습니다. 그럼에도 불구하고 필요한 서비스 및 플러그인은 첫 번째 호출로만 초기화됩니다. 따라서 예를 들어 개발자 팀에서 init () 함수에 대한 호출 이 실수로 두 번 이상 이루어진 경우 아무런 해를 끼치 지 않습니다. 유틸리티 클래스의 또 다른 바람직한 특성. 내가 여기서 뭘하는지 알아? 일종의 '완벽한'으로 만듭니다. 권리?

설정 초기화

그건 그렇고, 이러한 매개 변수가 해당 정적 변수에 전달되면 예제에서 더 많은 옵션이 있음을 의미합니다. 때 초기화 () 함수가 호출되고, 설정이 대신 다음과가 지정되어있다. 이렇게하면 oneShot (), oneShotAt () 및 주기적 () 함수에 대한 모든 후속 호출이 명시 적으로 자체 설정을 제공하지 않는 경우 해당 설정을 사용할 수 있습니다. 나는 이것을 아래에서 시연했다. init () 함수 의 추가 매개 변수 가 대신 사용 된 경우 예제 코드의 차이점을 확인할 수 있습니다 . 그러면 기간, ID 및 필요한 콜백 함수와 함께 'oneShot'함수 호출이 남습니다. 코드를 좀 더 깔끔하게 만듭니다. 옵션!

D build () 함수에 init ()를 배치하지 마십시오 ! AndroidAlarmManager 라는 Flutter 플러그인의 자체 init () 함수 가 나타납니다 . initialize () ;, 부작용이나 문제를 일으키는 경향이 있습니다. 경우에 따라 다시 빌드를 시작합니다 ( setState () 함수를 호출하는 것과 비슷 함 ). 이것이 내 유틸리티 클래스에 별도의 init () 함수 가있는 이유 입니다. 예를 들어 MaterialApp이있는 FutureBuilder 위젯에서 앱 시작 부분에 호출하는 것이 좋습니다. 직접 확인하고 수정 된 예제 에서 initSettings () 의 AlarmManger.init () 함수를 주석 처리하고 대신 oneShot () 함수 바로 앞에 배치합니다 (아래 참조). 그러면 예제에서 오류가 발생하기 시작합니다.

android_alarm_manager.dart

원샷 가져 가기

좋아요, 유틸리티 클래스로 돌아갑니다. 에서 원샷 () 함수, 처음 세 개의 매개 변수 값이 유효성 테스트 및 플러그인의 자신에 전달하는 '필수' 원샷 () 함수. 'Function'매개 변수 인 callback을 제외한 모두 . 대신, _Callback.oneShots [id] = callback 명령을 사용하여 제공된 정수 ID로 고유하게 식별되는 정적 Map 객체에 추가됩니다 . 우리는 곧 그것에 대해 돌아갈 것입니다. 마지막으로, 헬퍼 클래스 _Callback 에서도 발견 되는 정적 함수 oneShot ()에 대한 호출이 있음을 알 수 있습니다 . 플러그인에서 사용하는 데 필요한 '정적 기능'으로 나타납니다. 이렇게하면 나머지 매개 변수 값은 null 통합 연산자 ??를 사용하여 많은 정적 변수를 가져옵니다 . . 연산자가 사용되므로 명시 적 매개 변수가 전달되지 않으면 해당 정적 변수의 값이 대신 사용됩니다. 알 겠어요? 그런데 이러한 정적 변수는 모두 기본값으로 초기화되므로 결국 플러그인 자체에 전달되는 null 값이 없습니다. 좋은.

alarm_manager.dart

기회가 없습니다

플러그인 자체에 대한 호출도 try-catch 문으로 묶여 있습니다. 타사 프로그램이기 때문입니다. 우리는 무슨 일이 일어날 수 있는지 알지 못합니다. 이것은 유틸리티 클래스이기 때문에 앱을 중단하고 싶지 않고 대신 발생할 수있는 모든 예외를 포착합니다.

또한 다른 좋은 유틸리티 클래스와 마찬가지로이 클래스는 개발자가 작업의 성공 여부를 '테스트'할 수있는 수단을 가지고 있습니다. 그렇지 않은 경우 발생한 예외가 기록되어 개발자가 처리 할 수 ​​있습니다. 이것은 새로 삽입 된 if 문이 있는 수정 된 예제에서 아래에 설명되어 있습니다 .

android_alarm_manager.dart

더 정적

더 나아가 유틸리티 클래스 인 AlarmManager . 우리는 볼 oneShotAt () 함수를. 다시 말하지만, 이러한 모든 함수는 정적 함수이기 때문에 일부 보호 장치를 코드에 통합해야합니다. 예를 들어, 불행한 상황에서는이 onShotAt () 함수가 호출 될 때 플러그인이 먼저 초기화되지 않을 수 있습니다 . 즉, init () 함수가 먼저 호출되지 않은 것입니다. 일반 대중이 사용할 때 발생할 수 있습니다. 아래 스크린 샷에서 확인할 수 있습니다. 이러한 상황은 assert () 함수로 테스트 됩니다. 이것은 개발자가 개발 중에 그러한 실수를 포착하기를 바랍니다. 프로덕션에서는 assert () 함수 뒤에 오는 if 문에 의해 포착됩니다 .

oneShotAt () 함수에는 전달 된 '콜백'함수를 저장하기위한 자체 Map 객체가 있으며 플러그인 자체의 oneShotAt () 함수에 전달되는 자체 정적 함수 인 _Callback.onShatAt ()이 있습니다 . 이 모든 것은 향후에 발생하는 작업의 수를 예약하는 앱에서 이러한 함수를 여러 번 호출 할 수 있음을 의미합니다. 물론 각각 고유 한 ID 값이 할당되어야합니다. 그렇지 않으면 동일한 id 값을 사용하는 경우 이미 예약 된 모든 작업을 새 작업으로 덮어 씁니다. 이것이 고유 ID를 사용할 때의 포인트입니다. 권리?

그러나이 모든 것은 동일한 ID를 사용할 수 있음을 의미하지만 세 가지 다른 기능인 oneShot (), oneShotAt () 및 주기적 () 간에는 별도로 사용할 수 있습니다. 고유 한 별도의 Map 객체와 정적 기능이 있다는 점을 기억하십시오. 이 사실은 ID가 상주 데이터베이스의 기본 필드에서 발견 된 바로 그 값인 최근 프로젝트에서 저에게 도움이되었습니다. 옵션, 자기야! 그것을 사랑하십시오!

alarm_manager.dart

플러그인 엿보기

이제 Flutter 플러그인의 자체 oneShot () 및 oneShotAt () 함수를 간략히 살펴보면 oneShot () 함수가 실제로 oneShotAt () 대응 항목 과 함께 매개 변수를 전달하는 것을 볼 수 있습니다 . 아래 스크린 샷에서 볼 수있는 'CallbackHandle'객체 는 Flutter의 프레임 워크 함수 인 PluginUtilities.getCallbackHandle (callback) 이라고하는 _getCallbackHandle () 함수에서 온 것 입니다. 이 작업은 콜백 함수의 복사본을 '눈물'로 제거하여 액세스 할 수 있도록하고 백그라운드에서 실행중인 Isolate에서 이러한 함수를 호출합니다. 이것도 다시 설명하겠습니다.

콜백 작업

지금은 계속해서 라이브러리 파일 의 'helper class'_Callback을 살펴 보겠습니다 . Callback 함수 개체에 추가되는 Map 개체는이 클래스에서 정적 속성으로 정의되어있는 것을 아래에서 볼 수 있습니다. 이 클래스에는 또한 init () 함수가 있으며 AlarmManger의 자체 init () 함수에서 호출됩니다. 이 init () 함수에서 '통신 포트'가 세 개의 특정 이름 식별자로 등록됩니다. 포트는 백그라운드 Isolate에서 메시지를 전달하여 포 그라운드 Isolate와 통신하는 데 사용됩니다. 이러한 이름 식별자의 값이 무엇인지 추측하십시오. 그들은 아래의 변수에 저장된 스크린 샷에 표시 _oneShot , _oneShotAt ,_periodic .

alarm_manager.dart

이름에서 알 수 있듯이 분리
는 설계 상 분리 된 별도의 메모리 세그먼트 입니다. 기억의 공유가 없습니다. Isolates간에 메시지 전달 만 있습니다. 이러한 메시지의 내용은 기본 값 (null, num, bool, double, String), SendPort 개체 의 인스턴스 , List 개체 또는 처음 언급 된 기본 값이있는 Map 개체 일 수 있습니다.

백그라운드에서 듣기

이 경우에는 알람 서비스를 실행하는 백그라운드 Isolate에 의해 메시지가 수신되면 반응 할 '수신기'가 포트에 추가로 할당됩니다. 리스너는 Map 객체를 매개 변수로 사용하는 익명 함수의 형태입니다. 아래에서 Map 객체에는 정수 값 (ID가 됨)과 '이름 식별자'중 하나를 저장하는 문자열이 포함되어 있습니다. 경우 문은 화재입니다 기능을하는 '유형'후 결정합니다. 어떻게 작동하는지 보셨나요? 물론 유틸리티 클래스이기 때문에 모두 try-catch 문으로 묶여 있습니다. 예를 들어, 우리는 선택한 함수가 실행될 때 어떤 일이 일어날 지 전혀 모릅니다. 발생할 수있는 모든 예외를 포착하려고합니다. 권리?

alarm_manager.dart

메세지를 보내다

그렇다면이 메시지는 포 그라운드에서 실행되는 앱에 어떻게 전송됩니까? 일단 이러한 이름 식별자가 위에 등록되면 (아래 참조) 세 가지 유틸리티 클래스 함수 인 AlarmManager 중 하나가 됩니다. oneShot (), AlarmManager . oneShotAt () ,알람 관리기 . periodic ()은 해당하는 세 가지 정적 함수 _Callback을 전달합니다 . onShot (), _Callback . onShotAt () 및 _Callback . 주기적 (), Flutter 플러그인에 직접. 이렇게하면 백그라운드 Isolate가 포 그라운드 Isolate에서 실행중인 앱에 메시지를 다시 전달할 수 있습니다. 세 가지 유형의 통화가 모두 아래에 나열되어 있습니다.

이 세 가지 해당 정적 함수 인 _Callback 입니다. onShot (), _Callback . onShotAt () 및 _Callback . 주기적 (), 즉 배경 분리에서 전경 분리까지의 '다리'입니다. 예를 들어 알람을 설정할 때가되면 알람 서비스가이 세 가지 정적 기능 중 하나를 호출합니다. 발생하는대로 전경 Isolate에 정의 된 실제 함수가 아니라 '찢어진 복사본'입니다. 이 사실 때문에 직관적이지 않은 행동을 보게 될 것입니다. 예를 들어 포 그라운드 Isolate에서 일반적으로 정의 된 해당 함수의 모든 Static 변수는 백그라운드 Isolate에서 null이됩니다. 이 현상을 직접 테스트 할 수 있습니다.

예를 들어, 수정 된 예제에서 버튼을 세 번 누르면 Map 객체 인 oneShots 가 5 초 후에 화면을 실행하고 업데이트 할 하나의 Function 객체가 있다는 것을 알고 있습니다. 아래 '리스너'루틴의. 그러나이 과정에서 백그라운드에서 액세스하면 해당 Map 개체가 비어 있습니다. Isolate ?! 어떻게 가능합니까? 이것은 전경 Isolate에있는 것이 아니라 Map 오브젝트의 복사본이기 때문에 가능합니다. 다시 말하지만 Isolates는 서로에게 '메시지'만 전달할 수 있습니다. 그들은 기억을 공유하지 않습니다.

다시 말하지만,이 세 가지 정적 함수는 헬퍼 클래스 _Callback에 있으며 차례로 나열됩니다. 아래 스크린 샷에 표시됩니다. 각각에서 전경 Isolate가 '이름 식별자'를 사용하여 참조되고 배경 Isolate에서 Map 객체가 전달되는 것을 볼 수 있습니다. 조건부 멤버 액세스 연산자 ?. , 조회 작업이 null을 반환하는 경우에 사용됩니다. 예를 들어 이름이 존재하지 않으면 그렇게됩니다. 이것이 모두 내재화 된 코드이기 때문에 일어날 가능성은 거의 없지만 유틸리티 클래스이기 때문에 우리는 기회를 잡지 않습니다. 권리?

이 모든 라이브러리 파일의 끝에, 우리는 마침내 변수에 그 '이름 식별자'의 값을 참조 곳은 여기 _oneShot , _oneShotAt ,_periodic을 . 각각 해당하는 함수 유형에 따라 이름이 지정됩니다. 상상력이 좋지는 않지만 말이됩니다. 또한 클래스 또는 상위 수준 함수 외부에서 정의 된 고수준 변수라는 것을 알 수 있습니다. 사실, 그들은 키워드 const를 가진 상수 변수입니다 . 최종 변수와 마찬가지로 const 변수는 한 번만 초기화되며 변경할 수 없습니다. 최종 변수와는 달리 앱이 컴파일 될 때 정의됩니다. 따라서 여기서 우리의 필요에 따라 백그라운드 격리에도 사용할 수 있습니다. 좋은.

alarm_manager.dart

이 모든 Isolate 항목에 대한 핸들이 없다면. 지금 당장 걱정하지 마십시오. 그것이 유틸리티 클래스의 목적입니다. 원래 플러그인 예제 코드와 달리 '통신 포트'설정이나 정적 또는 고급 함수 또는 변수를 사용할 때에 대해 걱정할 필요가 없습니다. 이것이 제가 처음에이 수업을 작성한 이유입니다. 그래서 그 모든 것에 대해 걱정할 필요가 없습니다. 이것이 바로 그러한 유틸리티 클래스가 작성되는 이유입니다. 따라서 앞으로 우리 모두가 작성하게 될 많은 앱에서 계속해서 사용할 수 있습니다. 권리?

건배.

→ Greg Perry의 다른 이야기

YouTube에서 Flutter 디코딩

Suggested posts

좋은 습관을 만들고 유지하는 방법

장기적인 습관을 유지하기위한 생산성 팁

좋은 습관을 만들고 유지하는 방법

두 아이의 엄마가 된 후 일을 끝내기가 더 어려워졌습니다. 나는 한 작업에서 다음 작업으로 뛰어 들었고 하루가 끝날 때까지 아무것도하지 않았을 때 실망했습니다.

양자 컴퓨팅 Pt를위한 프로그래밍. 1 : NumPy

이제 양자 컴퓨팅이면의 물리학을 배우기 시작 했으므로 "이봐, 실제로 양자 컴퓨터를 사용하려면 실제로 양자 장치를 손으로 만들어야합니까?"라고 궁금해 할 것입니다. 답은 양자 컴퓨터를 컴퓨터라고 부르는 이유가 있습니다. 프로그래밍이 가능합니다! 이 시리즈에서는 수학 개념을 시뮬레이션하고 양자 컴퓨터에서 실행하는 소프트웨어를 구축하는 방법을 배우게됩니다. 깨끗하고 현대적이며 라이브러리가 풍부한 언어이기 때문에 Python을 사용하여 코드를 작성할 것입니다.

Related posts

Kotlin을 사용하여 Android RecyclerView 항목을 다시 정렬하려면 드래그하세요.

Android 앱에서 멋진 맞춤형 목록 작성

Kotlin을 사용하여 Android RecyclerView 항목을 다시 정렬하려면 드래그하세요.

이 기사에서는 항목을 다시 정렬 할 수있는 기능을 제공하는 RecyclerView를 구현하는 방법에 대해 알아 봅니다. 타사 라이브러리를 사용하지 않고이 작업을 수행 할 것입니다.

Google Play 인앱 리뷰

Google Play 인앱 리뷰

Google Play Core 라이브러리는 인앱 리뷰에 대한 지원을 추가하여 사용자가 앱이나 게임을 떠나지 않고도 평점과 리뷰를 제출할 수 있도록합니다. 이 문서는 메모장 앱 연구 사례를 통해 Android에서이 기능을 구현하는 방법과 Google Play 스토어에서 사용자의 가시성에 미치는 영향을 보여줍니다.

Android에서 나만의 AR 애플리케이션 만들기

Android에서 나만의 AR 애플리케이션 만들기

이 기사에서는 카메라에서 얼굴에 효과를주는 Android 애플리케이션을 실시간으로 작성하는 방법을 설명합니다. 여기서는 카메라 작업, 얼굴 찾기, 얼굴의 포인트 찾기 및 결과 그리기 등 모든 핵심 사항을 살펴 보겠습니다.

Gradle 종속성 : 메시 🤯

Gradle 종속성을 현명하게 관리하세요 !!

Gradle 종속성 : 메시 🤯

종속성이 증가 할 때마다 Gradle 파일을 관리하기가 어려워집니다. 이 블로그에서는 종속성을 다른 파일로 이동하고 유사한 종속성을 그룹화하여 관리하려고합니다.