Liffの立ち上げ in Javascript SDK
アプリをliffに繋ぎ込む際にはLIFF SDKを使うと思いますが、FlutterはDartで書かれている為、SDKを直接使う事が出来ません。
そこでFlutterからJavaScriptのメソッドを実行する事を可能にしてくれるパッケージを使い、LIFF SDKを呼び出していきます。
今回はまずLIFF SDKのinit
メソッドをFlutter側から呼び出してみましょう。
使用パッケージ
こちらのjs
パッケージを使っていきます。
実装
大まかな手順は以下の通りです。
- jsパッケージをインストール
- LIFF SDKをインストール
- LIFF SDKを呼び出すjsの処理を定義
- 定義したjsの処理をDartで呼び出すインターフェースを定義
- 定義したDart側のインターフェースを呼び出す
ディレクトリ構成
.
├── pubspec.yaml # jsパッケージをインストール
├── ...
├── web
│ ├── index.html # LIFF SDKをインストール
│ ├── ...
│ └── flutter_liff.js # LIFFを呼び出すjsのメソッドを定義
│
└── lib
├── main.dart # インターフェースに定義されたメソッドを呼び出す
├── ...
└── js
└── flutter_liff.dart # jsメソッドを呼び出すインターフェース
1. jsパッケージをインストール
プロジェクトのルートで下記コマンドを実行し、js
パッケージをインストールします。
$ flutter pub add js
2. LIFF SDKをインポート
次にLIFF SDKを呼び出せる様にFlutter Web側でインストールします。
<script charset="utf-8" src="https://static.line-scdn.net/liff/edge/versions/2.20.3/sdk.js"></script>
3. LIFF SDKを呼び出すjsの処理を定義
liff idを引数で受け取り、initメソッドに渡すシンプルなメソッドを定義します。
async function init(liffId){
console.log("init called")
await liff.init({
liffId: liffId,
})
}
4. js処理を呼び出すDartのインターフェースを定義
今度は上記のメソッドを呼び出すDartのインターフェースを定義します。
まず大前提としてはjs
パッケージではjs側のファイルや処理を呼び出すコードの前に@JS()
アノテーション付けます。
() // jsライブラリ読み込みの為のアノテーション
library flutter_liff;
import 'package:js/js.dart';
('init') // jsライブラリ内のメソッドの為のアノテーション
external Object init(String liffId);
jsの処理を定義したファイルをライブラリとしてインポート。読み込まれてるのは先ほど定義したflutter_liff.js
です。
()
library flutter_liff;
次にjs
パッケージも忘れずにインポート。
import 'package:js/js.dart';
そして以下がメソッドのインターフェース定義になります。
('init') // 対応するjsの処理を定義
external Object init(String liffId);
メソッドのインターフェースではJS
アノテーションでどのjsの処理に対応するかを定義しています。
dartメソッドの頭にexternal
句を付けて引数、返り値をjsの処理と同様にします。
本来init
メソッドには返り値はありませんが、flutter_liff.js
に定義したinitメソッドは非同期処理となる為、返り値はPromise
になります。
Dart側ではPromiseはそのままでは扱えない為、Object
型として受け取っています。
5. 呼び出す
main関数内で定義したinit
メソッドを呼び出します。
import 'js/flutter_liff.dart' as liff;
import 'package:js/js_util.dart';
Future<void> main() async {
final liffId = // envファイルから取得
await promiseToFuture(liff.init(liffId));
}
手順としては以下の通りです。
- initメソッドを定義したファイルをインポート
- envファイルなどからliffIdを取得
- liffIdを引数に定義したメソッドを実行
通常、Dartの非同期処理Future
はawait
句を付けるだけで良いのですが、js側から返されるPromise
は一度Future
に変換する必要があります。
その為、js
パッケージ内のjs_util
に定義されているpromiseToFuture
メソッドでラップしてあげる事でjsから渡ってくるPromise
を変換してあげます。
以上を実装した後、コンソールにて"init called"
のメッセージが表示されていれば、繋ぎ込み完了です。