Flutter-Android固有のコードの記述
Flutterは、プラットフォーム固有の機能にアクセスするための一般的なフレームワークを提供します。これにより、開発者はプラットフォーム固有のコードを使用してFlutterフレームワークの機能を拡張できます。カメラ、バッテリーレベル、ブラウザーなどのプラットフォーム固有の機能には、フレームワークを介して簡単にアクセスできます。
プラットフォーム固有のコードにアクセスする一般的な考え方は、単純なメッセージングプロトコルを使用することです。フラッターコード、クライアント、プラットフォームコード、およびホストは、共通のメッセージチャネルにバインドします。クライアントは、メッセージチャネルを介してホストにメッセージを送信します。ホストはメッセージチャネルでリッスンし、メッセージを受信して必要な機能を実行し、最後にメッセージチャネルを介して結果をクライアントに返します。
プラットフォーム固有のコードアーキテクチャは、以下のブロック図に示されています。
メッセージングプロトコルは、数値、文字列、ブール値などのJSONのような値のバイナリシリアル化をサポートする標準メッセージコーデック(StandardMessageCodecクラス)を使用します。シリアル化と逆シリアル化は、クライアントとホストの間で透過的に機能します。
Android SDKを使用してブラウザを開く簡単なアプリケーションを作成し、その方法を理解しましょう
AndroidStudioで新しいFlutterアプリケーションflutter_browser_appを作成します
main.dartコードを以下のコードに置き換えます-
import 'package:flutter/material.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: null,
),
),
);
}
}
ここでは、ブラウザを開き、そのonPressedメソッドをnullに設定するための新しいボタンを作成しました。
ここで、次のパッケージをインポートします-
import 'dart:async';
import 'package:flutter/services.dart';
ここで、services.dartには、プラットフォーム固有のコードを呼び出す機能が含まれています。
MyHomePageウィジェットで新しいメッセージチャネルを作成します。
static const platform = const
MethodChannel('flutterapp.tutorialspoint.com/browser');
メソッド、_openBrowserを記述してプラットフォーム固有のメソッドを呼び出し、メッセージチャネルを介してopenBrowserメソッドを記述します。
Future<void> _openBrowser() async {
try {
final int result = await platform.invokeMethod(
'openBrowser', <String, String>{
'url': "https://flutter.dev"
}
);
}
on PlatformException catch (e) {
// Unable to open the browser
print(e);
}
}
ここでは、platform.invokeMethodを使用してopenBrowserを呼び出しました(次の手順で説明します)。openBrowserには、特定のURLを開くための引数urlがあります。
RaisedButtonのonPressedプロパティの値をnullから_openBrowserに変更します。
onPressed: _openBrowser,
MainActivity.java(androidフォルダー内)を開き、必要なライブラリをインポートします-
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
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.plugins.GeneratedPluginRegistrant;
ブラウザを開くためのメソッドopenBrowserを記述します
private void openBrowser(MethodCall call, Result result, String url) {
Activity activity = this;
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);
}
ここで、MainActivityクラスにチャネル名を設定します-
private static final String CHANNEL = "flutterapp.tutorialspoint.com/browser";
onCreateメソッドでメッセージ処理を設定するAndroid固有のコードを記述します-
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
String url = call.argument("url");
if (call.method.equals("openBrowser")) {
openBrowser(call, result, url);
} else {
result.notImplemented();
}
}
});
ここでは、MethodChannelクラスを使用してメッセージチャネルを作成し、MethodCallHandlerクラスを使用してメッセージを処理しました。onMethodCallは、メッセージをチェックすることによって正しいプラットフォーム固有のコードを呼び出すための実際のメソッドです。onMethodCallメソッドは、メッセージからURLを抽出し、メソッド呼び出しがopenBrowserの場合にのみopenBrowserを呼び出します。それ以外の場合は、notImplementedメソッドを返します。
アプリケーションの完全なソースコードは次のとおりです-
main.dart
MainActivity.java
package com.tutorialspoint.flutterapp.flutter_browser_app;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "flutterapp.tutorialspoint.com/browser";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
String url = call.argument("url");
if (call.method.equals("openBrowser")) {
openBrowser(call, result, url);
} else {
result.notImplemented();
}
}
}
);
}
private void openBrowser(MethodCall call, Result result, String url) {
Activity activity = this; 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);
}
}
main.dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.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;
static const platform = const MethodChannel('flutterapp.tutorialspoint.com/browser');
Future<void> _openBrowser() async {
try {
final int result = await platform.invokeMethod('openBrowser', <String, String>{
'url': "https://flutter.dev"
});
}
on PlatformException catch (e) {
// Unable to open the browser print(e);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.title),
),
body: Center(
child: RaisedButton(
child: Text('Open Browser'),
onPressed: _openBrowser,
),
),
);
}
}
アプリケーションを実行し、[ブラウザを開く]ボタンをクリックすると、ブラウザが起動していることがわかります。ブラウザアプリ-ホームページはここのスクリーンショットに示されているとおりです-