Flutter-introduction-to-package
Flutter-パッケージの概要
Dartの一連の機能を整理および共有する方法は、パッケージを使用することです。 Dartパッケージは、単に共有可能なライブラリまたはモジュールです。 一般に、DartパッケージはDartアプリケーションと同じですが、Dartパッケージにはアプリケーションエントリポイントmainがありません。
パッケージの一般的な構造(デモパッケージ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つで、名詞(英語の名詞をリストする)、音節(単語の音節の数を指定する)などの基本的なユーティリティ機能があります。
フラッターパッケージ
Flutterフレームワークに依存し、モバイル環境でのみ使用できる汎用Dartコード。 たとえば、fluroはフラッター用のカスタムルーターです。 Flutterフレームワークに依存します。
Flutterプラグイン
一般的なDartコード。Flutterフレームワークと、基盤となるプラットフォームコード(Android SDKまたはiOS SDK)に依存します。 たとえば、カメラはデバイスのカメラと対話するためのプラグインです。 Flutterフレームワークとカメラにアクセスするための基礎となるフレームワークに依存します。
Dartパッケージを使用する
Dartパッケージはホストされ、ライブサーバーhttps://pub.dev [[[1]]]に公開されます。また、Flutterは、アプリケーションでDartパッケージを管理するための単純なツールpubを提供します。 パッケージとして使用するために必要な手順は次のとおりです-
- 以下に示すように、pubspec.yamlに必要なパッケージ名とバージョンを含めます-
dependencies: english_words: ^3.1.5
- 最新のバージョン番号は、オンラインサーバーを確認することで確認できます。
- 次のコマンドを使用して、アプリケーションにパッケージをインストールします-
flutter packages get
- Androidスタジオでの開発中に、Android Studioはpubspec.yamlの変更を検出し、以下に示すように開発者にAndroidスタジオパッケージアラートを表示します-
- Dartパッケージは、メニューオプションを使用してAndroid Studioにインストールまたは更新できます。
- 以下に示すコマンドを使用して必要なファイルをインポートし、作業を開始します-
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サイトを開くことを許可することです。
- Android Studioを起動します。
- [ファイル]→[新しいFlutterプロジェクト]をクリックし、[Flutterプラグイン]オプションを選択します。
- ここに示すように、Flutterプラグインの選択ウィンドウが表示されます-
- プロジェクト名としてmy_browserを入力し、[次へ]をクリックします。
- ここに示すように、ウィンドウにプラグイン名とその他の詳細を入力します-
- 下のウィンドウに会社のドメインflutterplugins.finddevguides.comを入力し、[*完了]をクリックします。 新しいプラグインを開発するためのスタートアップコードが生成されます。
- 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);
}
- onBrowseCallメソッドを変更して、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();
}
}
- プラットフォーム固有のopenBrowserメソッドを記述して、MyBrowserPluginクラスのブラウザーにアクセスします。
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.finddevguides.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スタジオは、pubspec.yamlが以下のAndroidスタジオパッケージアラートに示されているように更新されたことを警告します-
- [依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
- 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"),
),
),
);
}
}
- アプリケーションを実行し、「ブラウザーを開く」ボタンをクリックして、ブラウザーが起動することを確認します。 あなたは、ブラウザアプリを見ることができます-以下に示すスクリーンショットに示すようにホームページ-
あなたは、ブラウザアプリを見ることができます-下に示すスクリーンショットに示されているブラウザ画面-