Slide 1

Slide 1 text

Flutter Package 
 &
 Plugin Package Flutter Meetup Tokyo #1

Slide 2

Slide 2 text

About Me • Dart͕࠷ڧͱݴ͍ଓ͚ͨਓͰ͢ʂ • ϓϩήʔϚʔ໨ࢦͯ͠·͢ʂ • Discord : operandoOS • Steam : operandoOS • YouTubeͰήʔϜ഑৴ͯ͠·͢ʂ • https://www.youtube.com/user/opp228

Slide 3

Slide 3 text

ٕज़ॻయ4Ͱຊग़͠·͢ʂ • ͜͏ͯ͠๻Β͸ɺॻ੶ΛചΔΞϓϦΛ࡞ͬͨ 2.0.1 • ͥͻങ͍ʹདྷͯͶʂ • Flutterશؔ͘܎ͳ͍Ͱ͢ʂ • https://techbookfest.org/event/tbf04/circle/ 14710011

Slide 4

Slide 4 text

͜Ε͔Β঺հ͢Δ
 υΩϡϝϯτͷURL͚ͩ
 ֮͑ͯؼ͍ͬͯͩ͘͞ʂʂ
 ͦΕ͕͢΂ͯͰ͢ʂʂ

Slide 5

Slide 5 text

Package & Plugin document • Using Packages • https://flutter.io/using-packages/ • Developing Packages & Plugins • https://flutter.io/developing-packages/ • Platform-specific code • https://flutter.io/platform-channels/

Slide 6

Slide 6 text

What is a Packages? • Dart͸pubͰύοέʔδ؅ཧ͞ΕͯΔ • FlutterͷύοέʔδΛ୳͢ͱ͜Ζ΋͋Δ • https://pub.dartlang.org/flutter • ϥΠϒϥϦͱࢥͬͯ΋Β͏ͱΘ͔Γ΍͍͢

Slide 7

Slide 7 text

Flutter Package types • FlutterͰ͸Package types͕෼͔ΕͯΔ • Dart packages • Plugin packages

Slide 8

Slide 8 text

Dart packages • DartͰॻ͔ΕͨϥΠϒϥϦ • Flutterݻ༗ͷػೳؚ͕·Ε͍ͯΔ΋ͷ΋͋Δ

Slide 9

Slide 9 text

Dart packages • fluro • The brightest, hippest, coolest router for Flutter. • FlutterͷػೳΛ࢖ͬͯΔ͚ͲɺNativeͷػೳ͸ ࢖ͬͯͳ͍ • https://pub.dartlang.org/packages/fluro

Slide 10

Slide 10 text

Plugin packages • DartͰॻ͔ΕͨϥΠϒϥϦ • ϓϥοτϑΥʔϜ(iOS/Android)ݻ༗ͷ࣮૷ͱ ૊Έ߹Θͤ • Native BridgeϥΠϒϥϦతͳ

Slide 11

Slide 11 text

Plugin packages • shared_preferences • Wraps NSUserDefaults (on iOS) and SharedPreferences (on Android), providing a persistent store for simple data. • Flutter͔ΒNativeͷػೳɾAPIΛݺͼग़͢ • https://pub.dartlang.org/packages/ shared_preferences

Slide 12

Slide 12 text

Flutter plugins • Flutter teamͰ؅ཧ͞ΕͯΔPluginୡ • https://github.com/flutter/plugins • ͜͜ʹ͋Δͷ͸Plugin packagesͷΈ • Native Bridge࣮૷ͷࢀߟʹͳΔίʔυຬࡌͬΆ͍ • FirebaseͷPlugin͕ॆ࣮ͯ͠Δ

Slide 13

Slide 13 text

Native Bridgeͷ࢓૊Έ • ͜ͷυΩϡϝϯτಡΜͰ͍ͩ͘͞ʂ • Writing custom platform-specific code with platform channels • https://flutter.io/platform-channels/

Slide 14

Slide 14 text

Developing Plugin Packages • ෳࡶͳ΋ͷ͡Όͳ͚Εͳͬ͘͞ͱ࡞ΕΔ • ֤ϓϥοτϑΥʔϜͷAPI஌ͬͯΔͱָউ • pub΁ͷެ։΋؆୯

Slide 15

Slide 15 text

Developing Plugin Packages • ࠓ೔ͷਂ໷ʹ࡞ͬͨ • Flutter͔Β֤ϓϥοτϑΥʔϜͷ޿ࠂIDΛऔಘ͢ Δ΍ʔͭʔ • https://pub.dartlang.org/packages/ advertising_id • https://github.com/operando/advertising_id

Slide 16

Slide 16 text

Create the plugin packages • IntelliJ or Android Studio͔Β࡞Δͷָ͕

Slide 17

Slide 17 text

Create the plugin packages • ίϚϯυ͔ΒͰ΋࡞ΕΔ • NativeͷίʔυΛSwiftͱKotlinͰॻ͘ͳΒҎԼ flutter create —template=plugin -i swift -a kotlin advertising_id

Slide 18

Slide 18 text

advertising_id.dart import 'dart:async'; import 'package:flutter/services.dart'; class AdvertisingId { static const MethodChannel _channel = const MethodChannel('advertising_id'); static Future get id async { final String id = await _channel.invokeMethod(‘getAdvertisingId’); return id; } }

Slide 19

Slide 19 text

AdvertisingIdPlugin.kt class AdvertisingIdPlugin(private val registrar: Registrar) : MethodCallHandler { companion object { @JvmStatic fun registerWith(registrar: Registrar) { val channel = MethodChannel(registrar.messenger(), "advertising_id") channel.setMethodCallHandler(AdvertisingIdPlugin(registrar)) } } override fun onMethodCall(call: MethodCall, result: Result) { when (call.method) { "getAdvertisingId" -> thread { try { result.success( AdvertisingIdClient.getAdvertisingIdInfo(registrar.context()).id) } catch (e: Exception) { result.success("") } } else -> result.notImplemented() } } }

Slide 20

Slide 20 text

SwiftAdvertisingIdPlugin.swift public class SwiftAdvertisingIdPlugin: NSObject, FlutterPlugin { public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: “advertising_id", binaryMessenger: registrar.messenger()) let instance = SwiftAdvertisingIdPlugin() registrar.addMethodCallDelegate(instance, channel: channel) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "getAdvertisingId": var idfaString: String! let manager = ASIdentifierManager.shared() if manager.isAdvertisingTrackingEnabled { idfaString = manager.advertisingIdentifier.uuidString } else { idfaString = "" } result(idfaString) default: result(nil) } } }

Slide 21

Slide 21 text

pubspec.yaml name: advertising_id description: A Flutter plugin to access advertising ID. version: 0.9.0 author: Shinobu Okano homepage: https://github.com/operando/advertising_id flutter: plugin: androidPackage: com.os.operando.advertisingid pluginClass: AdvertisingIdPlugin dependencies: flutter: sdk: flutter environment: sdk: ">=1.21.0 <3.0.0" flutter: ">=0.1.4"

Slide 22

Slide 22 text

Publishing packages • PublishͷίϚϯυ͕༻ҙ͞ΕͯΔ • --dry-runΛ͚ͭͯ໰୊ͳ͍͔֬ೝ flutter packages pub publish --dry-run

Slide 23

Slide 23 text

Publishing packages • μϝͳͱ͜Ζͱ͔਌੾ʹڭ͑ͯ͘ΕΔͷͰ࠷ߴ☺

Slide 24

Slide 24 text

Publishing packages • pubspec.yamlͷॻ͖ํ͸Pubspec Formatͷ documentΛݟΔͱ਌੾ʹॻ͍ͯ͋Δ • https://www.dartlang.org/tools/pub/ pubspec

Slide 25

Slide 25 text

Publishing packages • pubʹpublish͢Δ • ͸͡Ίͯpubʹpublish͢Δ͚࣌ͩGoogleͷ ೝূ͕૸Δ flutter packages pub publish

Slide 26

Slide 26 text

ٙ໰ pubʹ͋͛ͨpackageͬͯ ফͤͳ͍ͷ͔ͳʁ

Slide 27

Slide 27 text

Now & Future [ٕज़ॻయ4৽ץ] - TechBooster • Flutter PluginΛ࡞Δ @sh4869 • ϘΫ͸ॻ͍ͯͳ͍Ͱ͢… • ͜Εʹ͞Βʹৄ͘͠ॻ͍ͯ͋Δ...͸ͣʂʂ • https://techbookfest.org/event/tbf04/ circle/11690001

Slide 28

Slide 28 text

Package & Plugin document • Using Packages • https://flutter.io/using-packages/ • Developing Packages & Plugins • https://flutter.io/developing-packages/ • Platform-specific code • https://flutter.io/platform-channels/

Slide 29

Slide 29 text

·ͱΊ • ύοέʔδ؅ཧ͸pub͕ͪΌΜͱͯ͠ΔͷͰ؆୯ʂ • Plugin Package͸؆୯ʹ࡞ΕΔɾެ։Ͱ͖Δ • ֤ϓϥοτϑΥʔϜͷAPI஌ͬͯΔͱָউ • ͡ΌΜ͡ΌΜPlugin Package࡞Δνϟϯεʂ

Slide 30

Slide 30 text

Thanks!!