HTMLファイルを表示する

2024年7月15日

開発環境
OS:Windows 11
SDK:VS Code + Flutter 3.7.12

概要

アプリ内のローカルストレージに格納したhtmlファイルを画面に表示します。

WebViewウィジェットを準備する

HTMLファイルはWebViewウィジェットを通して表示します。

そのため、WebViewパッケージをインストールする必要があります。

サンプルプロジェクトを生成して動作確認してみます。

webview_flutterをインストールします。

HTMLファイルを準備する

次にHTMLファイルを準備します。

<!DOCTYPE html>
<html lang="ja">

  <head>
    <meta charset="UTF-8">
    <title>Top Page</title>
  </head>

  <script>
    function sendData1() {
      // Flutterへデータ送信
      sample.postMessage("1");
    }
    function sendData2() {
      // Flutterへデータ送信
      sample.postMessage("2");
    }
  </script>

  <body>
    <h1>Please tap a button.</h1>
    <br>
    <br>
    <button onclick="sendData1()">Send Data 1</button>
    <br>
    <br>
    <button onclick="sendData2()">Send Data 2</button>
  </body>
</html>

ボタンが2つあるHTMLファイル(top.html)を作成しました。

プロジェクトフォルダ内に「html」フォルダを作成し、その中に作成したhtmlファイルを格納します。

次にpubspec.yamlのassets項目にhtmlファイルを定義します。

  assets:
    - html/top.html

WebViewウィジェット実装

main.dartにWebViewウィジェットを追加します。

ネットワーク上のurlにアクセスして表示するわけではないため、htmlのロード処理もあわせて追加する必要があります。

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late WebViewController controller;
  late Future<void> controllerInitialization;

  @override
  void initState() {
    super.initState();
    controllerInitialization = initController();
  }

  Future<void> initController() async {
    final html = await rootBundle.loadString('html/top.html');
    controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..addJavaScriptChannel('sample', onMessageReceived: (result) async {
          switch (result.message) {
            case "1":
              print("call 1.");
              break;
            case "2":
              print("call 2.");
              break;
          }
        })
      ..loadRequest(
        Uri.dataFromString(
          html,
          mimeType: "text/html",
          encoding: Encoding.getByName("utf-8"),
        ),
      );
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<void>(
      future: controllerInitialization,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          return Scaffold(
            appBar: AppBar(title: const Text("Test Page")),
            body: WebViewWidget(controller: controller),
          );
        } else {
          return const CircularProgressIndicator();
        }
      },
    );
  }
}

※Android向けのビルドが失敗した場合はこちら↓をチェックしてみてください。

動作確認

デバッグモードで起動しました。

HTMLのテキストと2つのボタンは期待通りに表示されています。

次にボタンを押し分けてみると・・・

ターミナルに「call 1.」、「call 2.」が表示されました。

ボタン操作も処理できることが確認できました。

今回は以上です。

ビルドエラー解消(JAVA_HOME)

2024年7月15日

開発環境
OS:Windows 11
SDK:VS Code + Flutter 3.7.12

概要

久しぶりにFlutterの動作確認をしようとサンプルプロジェクトを生成し、Android向けにビルドしたら失敗しました。

Android向けビルド時に発生したビルドエラーの解消方法についての話。

Flutter ビルドエラーの発生

サンプルプロジェクトを生成。

AndroidスマホをPCにUSB接続し、デバイスをチェック。

スマホのデバイスIDを取得し、デバイスIDを指定してデバッグ起動。

たったこれだけの手順でビルドエラーが発生してしまいました。

以前はビルドできたはずなんですが。。。

エラー内容は、以下。

環境変数「JAVA_HOME」に指定したディレクトリが存在しないってことのようです。

ということでディレクトリを見てみると・・・

ディレクトリ「jre」の直下はディレクトリ「bin」のみ。

そのディレクトリ「bin」の直下も.makerファイルのみと見事にもぬけの殻になっていました。

そういえば、最近、Android StudioのバージョンをFlamingoからIguanaにバージョンアップしたんだったっけ。。。

環境変数を編集する

ということでAndroid Studioの実体を探してみると・・・

環境変数を編集します。

Flutterビルドエラーの解消

ターミナルを立ち上げなおして再度、ビルドしてみます。

ビルドが成功し、スマホ上でサンプルアプリが起動しました。

今回は以上です。

Flutter SDKバージョンを管理する

2023年8月20日

開発環境
OS:Windows 11
SDK:VS Code + Flutter 3.7.5

概要

プロジェクト毎にFlutter SDKのバージョンを使い分ける方法です。

Flutter SDKのバージョン管理

Flutter SDKの開発サイクルは早いです。

日々、機能改善、機能追加が行われており、それに伴い、SDKバージョンも上がっています。

今現在(2023.08.20)の最新バージョンは、3.13.0です。

(SDKバージョンはこちらをチェック)

最新バージョンを使うことで既存機能やセキュリティの向上、新しい機能が利用できるなどのメリットがありますが、

その一方、バージョンが上がることによって問題になるのが挙動やI/Fの変更です。

自身がコーディングした箇所でバージョン違いによるI/Fの問題が発生する分には対応できますが、

組み込んでいるパッケージ内で最新バージョンに対応できないエラーが出るとお手上げです。

そこでそのようなバージョン違いによるパッケージ内エラーが発生するプロジェクトでは、

Flutter SDKのバージョンを開発当時のまま使用することでエラーの発生を抑えます。

(特にFlutter SDKバージョン2.x.x→3.x.xのバージョンアップはエラーが出やすいです。)

Flutte SDKバージョン管理ツール、fvmを使用します。

fvmをインストールする

まずはfvmをインストールします。

インストール手順については下記を参照してください。

Flutterプロジェクトにfvmを設定する

fvmで管理したいプロジェクトのフォルダに移動し、fvmコマンドを実行します。

コマンド内容
fvm releasesFlutter SDKのリリースバージョンをリスト表示する
fvm use (version)使用するバージョンを指定する
fvm install (version)指定バージョンのFlutter SDKをインストールする
fvm listインストール済みバージョンをリスト表示する
fvm remove (version)指定バージョンを削除する

※fvm useコマンドは、Windowsの場合、管理者権限のあるコマンドプロンプトで実行する必要があります。

fvmの設定が完了するとプロジェクトフォルダ内に.fvmが作成されます。

fvmを使用する

後はflutterコマンドの前にfvmを付けて使用します。

アプリを実行するなら、

fvm flutter run -d (実行対象)

アプリを作るなら、

fvm flutter build appbundle

今回は以上です。

Windowsにfvmをインストールする

2023年8月20日

開発環境
OS:Windows 11
SDK:VS Code + Flutter 3.7.5

概要

Flutter SDKのバージョン管理ツール、fvmをインストールします。

Chocolateyをインストールする

Windowsでfvmをインストールする場合、

Chocolatey(ソフトウェア管理ツール(無料))を使ってインストールすることになります。

そのため、まずはChocolateyをインストールします。

管理者権限のパワーシェルを起動し、下記コマンド※を入力します。

※複数行で表示されていますが、1つのコマンドです。

(詳細は、こちら

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(‘https://community.chocolatey.org/install.ps1’))

途中、キー入力が必要ですが、「Y」か、「A」を入力すればインストールが継続します。

これでChocolateyがインストールできました。

fvmをインストールする

次に管理者権限のパワーシェルで下記コマンドを入力し、fvmをインストールします。

choco install fvm

こちらも途中、キー入力が必要です。「Y」か、「A」でインストールが継続します。

これでfvmのインストールが完了。

のはずですが、コマンドプロンプトで「fvm –version」と入力しても動作しませんでした。

fvmのインストールが失敗する要因

どうやらfvmのインストールが失敗しているようです。

もう1度、fvmインストールコマンド「choco install fvm」を実行し、

キー入力の場面で「P」を入力し、実行スクリプトを確認してみます。

スクリプトを見ると、

dart pub getで何かを取得し、dart compileを使ってfvm.exeを作成する。

という流れのようです。

スクリプトが成功するとC:\ProgramData\chocolatey\lib\fvm\binにfvm.exeができるよう

ですが、フォルダの中を確認してみると存在しません。

つまり、dart compileでfvm.exeが作れていないってことのようです。。。

そこで最初に実行した「choco install fvm」コマンドの実行結果を見直してみると・・・

Error: Unable to find git in your PATH.

エラーが出ていました。

「git」が見つからない、だと。

gitをインストールする

PCに「git」がインストールされていないのが問題だったようです。

そこで管理者権限のパワーシェルで下記コマンドを入力し、gitをインストールします。

choco install git

こちらも同様、途中、キー入力が必要です。「Y」か、「A」でインストールが継続します。

もう一度、fvmをインストールする

gitのインストールが完了したので再度、fvmをインストールします。

fvm自体はすでにインストール済み、スクリプトが失敗した状態なので

強制インストールのオプション付きでインストールコマンドを実行します。

choco install fvm –force

ついに成功しました。

これでfvmが使用できます。

Macにfvmをインストールする

ちなみにMacにfvmをインストールする場合は下記コマンド。

brew install fvm

Homebrewがインストールされていれば、これだけでインストールできます。

(Windows)Chonolatey = (Mac)Homebrewって感じですね。

今回は以上です。

Webサイトを表示する

2023年8月5日

開発環境
OS:Windows 11
SDK:VS Code + flutter 3.7.5

概要

Webサイトを表示します。

Webサイトを表示する方法

flutterでWebサイトを表示する方法は2パターンあります。

Webブラウザを起動させて表示する方法と

ウィジェットWebViewを用意し、ウィジェットに表示させる方法です。

パターン1.Webブラウザを起動させて表示する

まずはパッケージ、url_launcher(ver 6.1.11)を導入します。

パッケージ詳細はこちら

コマンド入力する場合は、プロジェクトフォルダまで移動した後、下記を入力します。

flutter pub add url_launcher

あとは、launchUrlString(URL)をコールするだけです。

今回は、関数化し、ボタンタップ時に実行させるようにしました。

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher_string.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

void _openUrl() async {
  const url = 'https://messageexchanger-fa3e1.web.app';
  if (await canLaunchUrlString(url)) {
    await launchUrlString(url);
  } else {
    throw 'can not access this url.';
  }
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        width: double.infinity,
        height: double.infinity,
        alignment: Alignment.center,
        child: Column(
          children: <Widget>[
            Expanded(
              flex: 1,
              child: Container(
                alignment: Alignment.center,
                child:Image.asset('images/sample.jpg'),),),
            Expanded(
              flex :1,
              child: Container(
                alignment: Alignment.center,
                child: ElevatedButton(
                  onPressed: () async {
                    _openUrl();
                  },
                  style: ElevatedButton.styleFrom(
                    shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(5),
                    ),
                  ),
                  child: const Text('Web'),
                  ),))
          ],
        ),
      ),
    );
  } 
}

Chromeで実行した結果、Webサイトが表示されました。

起動時
ボタンタップ後

Androidで実行する場合は、AndroidManifest.xmlにqueries定義を追加する必要があります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sample">

    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="https" />
        </intent>
    </queries>

   <application
        android:label="sample"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">

  ・・・
起動時
ボタンタップ後

パターン2.ウィジェットWebViewを用意し、ウィジェットに表示させる

まずはパッケージ、webview_flutter(ver4.2.2)を導入します。

パッケージ詳細はこちら

コマンド入力する場合は、プロジェクトフォルダまで移動した後、下記を入力します。

flutter pub add webview_flutter

あとは、ScaffoldのbodyにWebViewWidgetを配置するだけです。

今回は、メイン画面とサブ画面の2画面を作成し、メイン画面でボタンタップするとWebViewWidgetを配置したサブ画面に遷移させるようにしてみました。

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class SubPage extends StatelessWidget  {
  const SubPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:WebViewWidget(
            controller: WebViewController()
              ..setJavaScriptMode(JavaScriptMode.unrestricted)
              ..loadRequest(Uri.parse("https://messageexchanger-fa3e1.web.app"))
          ),
    );
  }
}

Androidアプリで実行した結果、Webサイトが表示されました。

メイン画面
サブ画面

WebViewの注意点

webview_flutterのパッケージ詳細を見ると

サポート対象機種が、AndroidとiOSとなっています。

サポート対象に記載のないChromeで表示するとサブ画面表示のタイミングでダウンしました。

Chromeでは使用できないようです。

今回は以上です。

ビルドエラー解消(minSdkVersion)

2023年8月5日

開発環境
OS:Windows 11
SDK:VS Code + flutter 3.7.5

概要

パッケージ、webview_flutterを導入したところ、Androidアプリをビルドするときにエラーが出てしまいました。

今回は、ビルドエラーを解消します。

ビルドエラー

パッケージ、webview_flutterを導入し、Androidでデバッグしようとビルドした結果、

出力されたエラーがこちら。

デバッグコンソールに出力された内容を確認してみると、

minSdkVersionが16だと利用できない、とのこと。

さらに読み進めるとエラー解消方法が出力されていました。

┌─ Flutter Fix ─────────────────────────────────────────────────────────────────────────────────┐
│ The plugin webview_flutter_android requires a higher Android SDK version.                     │
│ Fix this issue by adding the following to the file                                            │
│ D:\work\vscode\sample2-2\android\app\build.gradle:                                            │
│ android {                                                                                     │
│   defaultConfig {                                                                             │
│     minSdkVersion 19                                                                          │
│   }                                                                                           │
│ } 

android/app/build.gradleのminSdkVersionの値を19にするらしい。

build.gradle

デバッグコンソールに出力されてエラー解消方法に従い、

build.gradleを確認してみると

minSdkVersionには、flutter.minSdkVersionが設定されていました。

flutter.minSdkVersionを追ってみたところ、

$flutterRoot/packages/flutter_tools/gradle/flutter.gradle内で定義を確認することができました。

(私の環境では、flutterRootはD:\work\apps\flutterでした。)

class FlutterExtension {
    /** Sets the compileSdkVersion used by default in Flutter app projects. */
    static int compileSdkVersion = 33

    /** Sets the minSdkVersion used by default in Flutter app projects. */
    static int minSdkVersion = 16

    /** Sets the targetSdkVersion used by default in Flutter app projects. */
    static int targetSdkVersion = 33

  ・・・

    /** Allows to override the target file. Otherwise, the target is lib/main.dart. */
    String target
}

flutter.minSdkVersionの定義値は16でした。

改修方針

flutter.gradleのminSdkVersionの定義値を16から19に変更したいところですが、

flutter.gradleは、全てのアプリが参照する共有ファイルです。

他のアプリへの影響を考慮すると変更できません。

と、いうことでアプリ内のbuild.gradleのminSdkVersionを変更します。

minSdkVersionを固定値「19」に置き換えました。

(結局のところ、デバッグコンソールの指示通りです。

ビルド結果

build.gradleの修正後、デバッグ実行した結果、正常に起動しました。

エラー要因

そもそも今回、なぜビルドエラーがでたのか?

導入したパッケージ、webview_flutterについてパッケージサイト、pub.devを確認したところ、AndroidのSupport SDKは、19以上と記載されていました。。。

今回は以上です。

開発環境と本番環境を使い分ける

2023年6月3日

開発環境
OS:Windows 11
SDK:VS Code + flutter 3.7.5

概要

データベースを使ったアプリ開発で必要になってくるのが開発環境と本番環境の分離。

開発用データベースと本番用データベースをコマンドベースで使い分けます。

Firebase設定ファイル

Firebaseのアクセス制御は、CLIでFirebase設定を行った際に自動生成するオプションファイル、firebase_options.dartの定義に従い行われます。

import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
import 'package:flutter/foundation.dart'
    show defaultTargetPlatform, kIsWeb, TargetPlatform;

class DefaultFirebaseOptions {
  static FirebaseOptions get currentPlatform {
    if (kIsWeb) {
      return web;
    }
    switch (defaultTargetPlatform) {
      case TargetPlatform.android:
        return android;
      case TargetPlatform.iOS:
        return ios;
      case TargetPlatform.macOS:
        throw UnsupportedError(
          'DefaultFirebaseOptions have not been configured for windows - '
          'you can reconfigure this by running the FlutterFire CLI again.',
        );
      case TargetPlatform.windows:
        throw UnsupportedError(
          'DefaultFirebaseOptions have not been configured for windows - '
          'you can reconfigure this by running the FlutterFire CLI again.',
        );
      case TargetPlatform.linux:
        throw UnsupportedError(
          'DefaultFirebaseOptions have not been configured for linux - '
          'you can reconfigure this by running the FlutterFire CLI again.',
        );
      default:
        throw UnsupportedError(
          'DefaultFirebaseOptions are not supported for this platform.',
        );
    }
  }

  static const FirebaseOptions web = FirebaseOptions(
    apiKey: '***************',
    appId: '***************',
    messagingSenderId: '***************',
    projectId: '***************',
    authDomain: '***************',
    databaseURL: '***************',
    storageBucket: '***************',
    measurementId: '***************',
  );

  static const FirebaseOptions android = FirebaseOptions(
    ~
  );

  static const FirebaseOptions ios = FirebaseOptions(
    ~
  );
}

ファイルの中身は、android、iOS、Web、デスクトップアプリ用にそれぞれ下記の設定値が

定義されています。

apiKey
appId
messagingSenderId
projectId
authDomain
databaseURL
storageBucket
measurementId

これらの設定値は、特定のFirebaseプロジェクトを指し示すものであり、

開発用、本番用と2つのプロジェクトを用意した場合は

2つのオプションファイルを使い分ける必要があります。

定義

ステップ1)ファイル名を分け、オプションファイルを共存させる

2つのオプションファイルを使い分けるためにファイル名を変更し、同一フォルダ内で管理します。

そこでlibフォルダの直下にgenフォルダを作成し、オプションファイルを格納することにします。

開発用)lib/gen/firebase_option_dev.dart

本番用)lib/gen/firebase_option_prod.dart

ステップ2)ソースコードでFlavorを使い、参照ファイルを使い分ける

FirebaseのInitial処理で参照先のオプションを振り分けます。

Flavorは、実行時に入力するコマンドオプションであり、

実行時に入力した値に従い、プログラムが実行します。

import 'package:firebase_core/firebase_core.dart';
import 'package:sample/gen/firebase_options_dev.dart' as dev;
import 'package:sample/gen/firebase_options_prod.dart' as prod;

void main() async {
  await Firebase.initializeApp(
    options: options: getFirebaseOptions(),
  );  
  runApp(MyApp());
}

FirebaseOptions getFirebaseOptions() {
  const flavor = String.fromEnvironment('FLAVOR');
  switch (flavor) {
    case 'dev':
      return dev.DefaultFirebaseOptions.currentPlatform;
    case 'prod':
      return prod.DefaultFirebaseOptions.currentPlatform;
    default:
      throw ArgumentError('No flavor');
  }
}

上記ではクラス「DefaultFirebaseOptions」が開発と本番で共存するため、

オプションンファイルをimportする際に「as」定義行い、使い分けています。

これでFlavorの入力値により参照先のFirebaseプロジェクトを切り替えることができます。

これで定義は終了です。

Flavorを使い、実行する

あとは実行する際にコマンドラインでFlavorを指定します。

デバッグ時) 開発環境のFirebaseを使用する

flutter run -d (デバイスID) –dart-define=FLAVOR=dev

アプリ作成時) 本番環境のFirebaseを使用する

flutter build appbundle –dart-define=FLAVOR=prod

パッケージIDを開発と本番で分ける場合は更にAndroid Studio、及び、Xcodeの変更が必要となります。

今回は以上です。

Firebaseを使ってみる(Firestore編)

2023年5月27日

開発環境
OS:Windows 11
SDK:VS Code + flutter 3.7.5

概要

アプリを作るうえで欠かすことのできない存在であるデータベース。

Firebaseなら簡単で気軽に利用することができます。

今回はFirebaseでデータの参照、更新を行います。

Firestoreを更新する

Firebaseのセットアップが済んだら、flutterでFirestoreを更新してみます。

入力ボックスとボタンを用意し、ボタン押下時に入力ボックスに入力された文字を

Firestoreに登録する処理を必要部分だけ抜粋しました。

import 'package:firebase_database/firebase_database.dart';

 final strComment = TextEditingController();

 //入力ボックス
  TextField(         
    controller: strComment,             
    decoration: InputDecoration(
      hintStyle: const TextStyle(fontSize: 10),
      hintText: 'コメントを入力する'
    ),
    maxLines: 1,
    style: const TextStyle(fontSize: 10),
  )

  //ボタン
	ElevatedButton(
	  onPressed: () async {
	    await setComment(strComment.text);
	  }, 
	  child: Text('コメント更新')
	))

  //更新処理
  Future<void> setComment(String comment) async {
    DatabaseReference comRef = FirebaseDatabase.instance.ref('comment').child('sample');
    comRef.set(comment);
  }

Firestoreは、No SQLデータベースです。

上記は、ドキュメント「comment」のフィールド「sample」に入力値をセットしています。

Firestoreを参照する

参照処理も更新処理と同様、参照パスを定義し、そのリファレンスをゲットするだけです。


 final strComment = TextEditingController();

  //ボタン
	ElevatedButton(
	  onPressed: () async {
	    strComment.text = await getComment();
      setState((){});
	  }, 
	  child: Text('コメント参照')
	))

  //参照処理
  Future<String> getComment() async {
    var rtnval = "";  
    DatabaseReference dbRef = FirebaseDatabase.instance.ref('comment').child('sample');
    final snapshot = await dbRef.get();
    if (snapshot.exists) {
      rtnval = snapshot.value.toString();
    }
    return rtnval;
  }

今回は以上です。

Firebaseを使ってみる(セットアップ編)

2023年5月27日

開発環境
OS:Windows 11
SDK:VS Code + flutter 3.7.5

概要

アプリを作るうえで欠かすことのできない存在であるデータベース。

Firebaseなら簡単、お気軽に利用することができます。

今回はFirebaseのセットアップを行います。

Firebaseでプロジェクトを作成する

Firebaseにアクセスし、プロジェクトを作成します。

無料のSparkプランと有料のBlazeプランがあります。

いつでもBlazeプランに切り替えることができるのでSparkプランから始めるのがいいかもしれません。

プロジェクトを作成したら、利用したい機能を有効にします。

FirestoreやStorageなどのデータベースについてはアクセス制限設定(ルール)が設けられています。

初めはリード、ライトが無効化されているので編集する必要があります。

Firestoreの場合、特定のパス(<some_path>の部分)のリード、ライトを許可するなら、下記のように定義します。

service cloud.firestore {
  match /databases/{database}/documents {
    match /<some_path>/{document=**} {
      allow read, write: if true;
    }
  }
}

Firebaseをセットアップする

ターミナルでFlutterプロジェクトに移動します。

下記コマンドを入力し、Firebase CLIをインストールします。

npm install -g firebase-tools

※Node.jsをインストールしてない場合は先にそちらをインストールします。

インストールが終わったら、下記コマンドでFirebaseにログインします。

(プロジェクトを作成したGoogleアカウントでログインします。)

firebase login

最後にFirebaseの初期化を行います。

firebase init

Firebaseのどの機能を使うかを選択します。

これでセットアップ完了です。

今回は以上です。

ネイティブコードで処理する

2023年4月28日

開発環境
OS:Windows 11
SDK:VS Code + flutter 3.7.5

ネイティブコード

FlutterでAndroid、iOS向けのアプリ開発を行っているとどうしてもDartでは処理できないネイティブコードに依存する処理を実装する場合がでてきます。

そのような場合はどうするか?

Dart側で内部通信処理を実装し、ネイティブコード側で処理をするよう依頼します。

ネイティブコード側は内部通信の受信を行い、依頼に従い、処理を行います。

MethodChannel

内部通信を行うためにMethodChannelを使用します。

例えば、ボタンを押下したときにネイティブコードで処理を行う場合、Dart側では下記のような実装になります。

MethodChannelで使用するチャンネルと通信コードはDart側とネイティブコード側で合わせます。

チャンネル「samplesetting」、通信コード「dispSetting」

import 'package:flutter/services.dart';


    child: ElevatedButton(
        onPressed: () async {
            const MethodChannel channel = MethodChannel('samplesetting');
            await channel.invokeMethod('dispSetting');
        },
    )

それに対し、ネイティブコード側は内部通信の受信を行い、処理を行います。

Androidの場合だと下記のような実装となります。

処理の実装は、プロジェクト作成時に自動生成されたMainActivity.ktで行います。

(プロジェクトフォルダ)\android\app\src\main\kotlin\・・・\MainActivity.kt

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.ExperimentalCoroutinesApi
import androidx.annotation.NonNull
import android.content.Intent
import android.provider.Settings
import android.net.Uri

class MainActivity: FlutterActivity() {
    private val CHANNEL = "samplesetting"

    @OptIn(ExperimentalCoroutinesApi::class)
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler{
                call, result ->
            if(call.method == "dispSetting"){
                try {
                    val intent = Intent();
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    intent.setData(Uri.parse("package:com.example.sample"))
                    startActivity(intent);
                    result.success("success");
                } catch (e:Exception) {
                    result.notImplemented()
                }
            }else{
                result.notImplemented()
            }
        }
    }
}

今回は設定画面を表示する処理を実装してみました。

※パッケージ app_settingsをインストールすれば、Dartだけで設定画面を表示することもできます。

動作確認

実機にインストールして動かすと下記のようになりました。

起動時
ボタン押下時

iOSでも同様に内部通信を受信し、ネイティブコードで処理を実行させることができます。

今回は以上です。