1週間ほど前からFultterの勉強をはじめました。
公式チュートリアルを少し触った後、Flutter入門(秀和システム)で勉強をしていたのですが、
こちらの本がAndroid向けに書かれているため、iOSではサンプルプログラムがそのままでは動作しない箇所があったため対処法をまとめておきます。
本の内容から関数名や処理内容などは変更しています。
VSCodeで開発およびデバッグをしていました。
ユーザーデータへのアクセス権の取得
現象
アクセス権を取得するためにsimple_permissions
を使用していますが、以下の処理でアプリケーションが強制終了していました。
void requestPermission() async {
await SimplePermissions.requestPermission(Permission.Camera);
await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
}
対処法
ユーザーデータへアクセスする目的を記述
<?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専用パラメータらしく、例外が発生して停止する。
void requestPermission() async {
await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
...
}
対処法
AndroidとiOSで処理を分けてiOS用のパラメータに変更。
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
を使用する部分でエラーが発生しました。
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を追加)
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でもひとまず動く様になりました。
何かおかしい部分などありましたらコメントで教えていただけるとありがたいです。