LoginSignup
3
3

More than 3 years have passed since last update.

「Flutter入門」で躓いた箇所

Posted at

1週間ほど前からFultterの勉強をはじめました。

公式チュートリアルを少し触った後、Flutter入門(秀和システム)で勉強をしていたのですが、
こちらの本がAndroid向けに書かれているため、iOSではサンプルプログラムがそのままでは動作しない箇所があったため対処法をまとめておきます。

本の内容から関数名や処理内容などは変更しています。

VSCodeで開発およびデバッグをしていました。

ユーザーデータへのアクセス権の取得

現象

アクセス権を取得するためにsimple_permissionsを使用していますが、以下の処理でアプリケーションが強制終了していました。

main.dart
void requestPermission() async {
  await SimplePermissions.requestPermission(Permission.Camera);
  await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
}

対処法

ユーザーデータへアクセスする目的を記述

iOS/Runner/info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>load local pictures</string>
    <key>NSAppleMusicUsageDescription</key>
    <string>save pictures</string>
        ....

参考:https://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/

画像保存のアクセス権取得

現象

画像保存のアクセス権取得処理用の以下のパラメータはAndroid専用パラメータらしく、例外が発生して停止する。

main.dart
void requestPermission() async {
  await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
  ...
}

対処法

AndroidとiOSで処理を分けてiOS用のパラメータに変更。

main.dart
void requestPermission() async {
    if (Platform.isAndroid && !await SimplePermissions.checkPermission(Permission.WriteExternalStorage)) {
      SimplePermissions.requestPermission(Permission.WriteExternalStorage);
    } else if (Platform.isIOS && !await SimplePermissions.checkPermission(Permission.PhotoLibrary)) {
      SimplePermissions.requestPermission(Permission.PhotoLibrary);
    }
  ...
}

参考:https://blog.aftercider.com/entry/2018/12/10/000000

返り値の型が合わないと怒られる

以下の様な dart:ui.Picture.toImage を使用する部分でエラーが発生しました。

main.dart
import 'dart:ui' as ui;
class MyClass extends CustomPainter {
  ...
  @override
  void hoge() {
    ui.Image img = piyo();
    ...
  }
  ...
  // ui.Imageを返す
  ui.Image piyo(){
    ....
    ui.Picture picture = recorder.endRecording();
    return picture.toImage(100.0, 100.0);
  }
}

エラー

The return type 'Future<Image>' isn't a 'Image', as defined by the method 'drawToCanvas'.dart(return_of_invalid_type)

対処法

dart:ui.Picture.toImage() の返り値の型は Future<Image> なので、返り値の型を変更。
また、drawToCanvas() をコールしている箇所を変更。
(async, awaitを追加)

main.dart
import 'dart:ui' as ui;
class MyClass extends CustomPainter {
  ...
  @override
  void hoge() async{
    ui.Image img = await piyo();
    ...
  }
  ...
  // ui.Imageを返す
  Future<ui.Image> piyo(){
    ....
    ui.Picture picture = recorder.endRecording();
    return picture.toImage(100.0, 100.0);
  }
}

これでiOSでもひとまず動く様になりました。
何かおかしい部分などありましたらコメントで教えていただけるとありがたいです。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3