Flutter-パッケージの概要
一連の機能を整理および共有するDartの方法は、Packageを使用することです。Dart Packageは、単に共有可能なライブラリまたはモジュールです。一般に、Dartパッケージにはアプリケーションエントリポイントmainがないことを除いて、DartパッケージはDartアプリケーションのパッケージと同じです。
パッケージの一般的な構造(デモパッケージmy_demo_packageを検討してください)は次のとおりです。
lib/src/* −プライベートDartコードファイル。
lib/my_demo_package.dart−メインのDartコードファイル。次のようにアプリケーションにインポートできます-
import 'package:my_demo_package/my_demo_package.dart'
以下に示すように、必要に応じて、他のプライベートコードファイルをメインコードファイル(my_demo_package.dart)にエクスポートできます。
export src/my_private_code.dart
lib/*−任意のカスタムフォルダ構造に配置された任意の数のDartコードファイル。コードには、次のようにアクセスできます。
import 'package:my_demo_package/custom_folder/custom_file.dart'
pubspec.yaml −プロジェクト仕様、アプリケーションと同じ、
パッケージ内のすべてのDartコードファイルは単なるDartクラスであり、Dartコードがパッケージに含めるための特別な要件はありません。
パッケージの種類
Dartパッケージは基本的に同様の機能の小さなコレクションであるため、機能に基づいて分類できます。
ダートパッケージ
Web環境とモバイル環境の両方で使用できる汎用Dartコード。たとえば、english_wordsは、約5000語を含み、名詞(英語で名詞を一覧表示)、音節(1つの単語の音節数を指定)などの基本的なユーティリティ関数を備えたパッケージの1つです。
フラッターパッケージ
Flutterフレームワークに依存し、モバイル環境でのみ使用できる汎用Dartコード。たとえば、fluroはフラッター用のカスタムルーターです。Flutterフレームワークに依存します。
Flutterプラグイン
Flutterフレームワークと基盤となるプラットフォームコード(AndroidSDKまたはiOSSDK)に依存する汎用Dartコード。たとえば、cameraはデバイスのカメラと対話するためのプラグインです。カメラにアクセスするには、Flutterフレームワークと基盤となるフレームワークに依存します。
ダートパッケージの使用
Dartパッケージはホストされ、ライブサーバーに公開されます。 https://pub.dartlang.org.また、Flutterは、アプリケーションでDartパッケージを管理するためのシンプルなツールであるpubを提供します。パッケージとして使用するために必要な手順は次のとおりです-
以下に示すように、パッケージ名と必要なバージョンをpubspec.yamlに含めます-
dependencies: english_words: ^3.1.5
最新のバージョン番号は、オンラインサーバーを確認することで確認できます。
次のコマンドを使用して、パッケージをアプリケーションにインストールします-
flutter packages get
Android Studioでの開発中に、Android Studioはpubspec.yamlの変更を検出し、以下に示すようにAndroidStudioパッケージアラートを開発者に表示します-
Dartパッケージは、メニューオプションを使用してAndroidStudioにインストールまたは更新できます。
以下に示すコマンドを使用して必要なファイルをインポートし、作業を開始します-
import 'package:english_words/english_words.dart';
パッケージで利用可能な任意の方法を使用し、
nouns.take(50).forEach(print);
ここでは、名詞関数を使用して上位50語を取得して出力しました。
Flutterプラグインパッケージを開発する
Flutterプラグインの開発は、DartアプリケーションまたはDartパッケージの開発に似ています。唯一の例外は、プラグインがシステムAPI(AndroidまたはiOS)を使用して、必要なプラットフォーム固有の機能を取得することです。
前の章でプラットフォームコードにアクセスする方法をすでに学習したので、プラグイン開発プロセスを理解するために、単純なプラグインmy_browserを開発しましょう。my_browserプラグインの機能は、アプリケーションがプラットフォーム固有のブラウザーで特定のWebサイトを開くことができるようにすることです。
AndroidStudioを起動します。
クリック File → New Flutter Project FlutterPluginオプションを選択します。
ここに示すようなFlutterプラグイン選択ウィンドウが表示されます-
プロジェクト名としてmy_browserを入力し、[次へ]をクリックします。
ここに示すように、ウィンドウにプラグイン名とその他の詳細を入力します-
以下に示すウィンドウに会社のドメインflutterplugins.tutorialspoint.comと入力し、をクリックします。 Finish。新しいプラグインを開発するためのスタートアップコードを生成します。
my_browser.dartファイルを開き、メソッドopenBrowserを記述して、プラットフォーム固有のopenBrowserメソッドを呼び出します。
Future<void> openBrowser(String urlString) async {
try {
final int result = await _channel.invokeMethod(
'openBrowser', <String, String>{ 'url': urlString }
);
}
on PlatformException catch (e) {
// Unable to open the browser print(e);
}
}
MyBrowserPlugin.javaファイルを開き、次のクラスをインポートします-
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
ここでは、Androidからブラウザを開くために必要なライブラリをインポートする必要があります。
MyBrowserPluginクラスにタイプRegistrarの新しいプライベート変数mRegistrarを追加します。
private final Registrar mRegistrar;
ここで、Registrarは、呼び出し元のコードのコンテキスト情報を取得するために使用されます。
MyBrowserPluginクラスにRegistrarを設定するコンストラクターを追加します。
private MyBrowserPlugin(Registrar registrar) {
this.mRegistrar = registrar;
}
registerWithを変更して、MyBrowserPluginクラスに新しいコンストラクターを含めます。
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), "my_browser");
MyBrowserPlugin instance = new MyBrowserPlugin(registrar);
channel.setMethodCallHandler(instance);
}
onMethodCallを変更して、MyBrowserPluginクラスにopenBrowserメソッドを含めます。
@Override
public void onMethodCall(MethodCall call, Result result) {
String url = call.argument("url");
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
}
else if (call.method.equals("openBrowser")) {
openBrowser(call, result, url);
} else {
result.notImplemented();
}
}
MyBrowserPluginクラスのブラウザにアクセスするためのプラットフォーム固有のopenBrowserメソッドを記述します。
private void openBrowser(MethodCall call, Result result, String url) {
Activity activity = mRegistrar.activity();
if (activity == null) {
result.error("ACTIVITY_NOT_AVAILABLE",
"Browser cannot be opened without foreground activity", null);
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
activity.startActivity(intent);
result.success((Object) true);
}
my_browserプラグインの完全なソースコードは次のとおりです-
my_browser.dart
import 'dart:async';
import 'package:flutter/services.dart';
class MyBrowser {
static const MethodChannel _channel = const MethodChannel('my_browser');
static Future<String> get platformVersion async {
final String version = await _channel.invokeMethod('getPlatformVersion'); return version;
}
Future<void> openBrowser(String urlString) async {
try {
final int result = await _channel.invokeMethod(
'openBrowser', <String, String>{'url': urlString});
}
on PlatformException catch (e) {
// Unable to open the browser print(e);
}
}
}
MyBrowserPlugin.java
package com.tutorialspoint.flutterplugins.my_browser;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
/** MyBrowserPlugin */
public class MyBrowserPlugin implements MethodCallHandler {
private final Registrar mRegistrar;
private MyBrowserPlugin(Registrar registrar) {
this.mRegistrar = registrar;
}
/** Plugin registration. */
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(
registrar.messenger(), "my_browser");
MyBrowserPlugin instance = new MyBrowserPlugin(registrar);
channel.setMethodCallHandler(instance);
}
@Override
public void onMethodCall(MethodCall call, Result result) {
String url = call.argument("url");
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
}
else if (call.method.equals("openBrowser")) {
openBrowser(call, result, url);
} else {
result.notImplemented();
}
}
private void openBrowser(MethodCall call, Result result, String url) {
Activity activity = mRegistrar.activity();
if (activity == null) {
result.error("ACTIVITY_NOT_AVAILABLE",
"Browser cannot be opened without foreground activity", null);
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
activity.startActivity(intent);
result.success((Object) true);
}
}
新しいプロジェクトmy_browser_plugin_testを作成して、新しく作成したプラグインをテストします。
pubspec.yamlを開き、my_browserをプラグインの依存関係として設定します。
dependencies:
flutter:
sdk: flutter
my_browser:
path: ../my_browser
Android Studioは、以下に示すAndroidStudioパッケージアラートに示すようにpubspec.yamlが更新されたことをアラートします-
[依存関係の取得]オプションをクリックします。Android Studioはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
main.dartを開き、my_browserプラグインを以下のように含めます-
import 'package:my_browser/my_browser.dart';
以下に示すように、my_browserプラグインからopenBrowser関数を呼び出します-
onPressed: () => MyBrowser().openBrowser("https://flutter.dev"),
main.dartの完全なコードは次のとおりです-
import 'package:flutter/material.dart';
import 'package:my_browser/my_browser.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(
title: 'Flutter Demo Home Page'
),
);,
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.title),
),
body: Center(
child: RaisedButton(
child: Text('Open Browser'),
onPressed: () => MyBrowser().openBrowser("https://flutter.dev"),
),
),
);
}
}
アプリケーションを実行し、[ブラウザを開く]ボタンをクリックして、ブラウザが起動することを確認します。以下に示すスクリーンショットに示すように、ブラウザアプリ-ホームページを見ることができます-
以下に示すスクリーンショットに示すように、ブラウザアプリ–ブラウザ画面を見ることができます-