Flutter : 画像の選択
Flutter + Firebase でアプリ作成のためのパーツあつめ。
画像選択のパッケージ、image_picker を試す。
https://pub.dev/packages/image_picker
のだが、AndroidX互換性問題に遭遇し難儀したが、何とか解決。
1.Flutter
1.1 pubspec.yaml (/) にimage_pickerを追記
dependencies:
:
image_picker: ^0.6.1+8
1.2 second.dart
画面遷移で起動した画面に、画像選択し、画像表示するウィジェットを追加する (関係ないコードは除外)
ウィジェットのルートにScaffoldを使用したままだと、写真を選択したときにサイズがはみ出ると、下図のように、はみで多分に黒と黄色の車線がはいって表示され、以下のようなエラーログが吐かれる。
════════ Exception caught by rendering library ═════════════════════════════════════════════════════ The following assertion was thrown during layout: A RenderFlex overflowed by 236 pixels on the bottom.
スクロールできるようにする必要があるようなので、以下のサンプルソースに合わせて、スクロールビューの中に入れる。
https://api.flutter.dev/flutter/widgets/SingleChildScrollView-class.html
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
class SecondRoute extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _SecondRoute();
}
}
class _SecondRoute extends State<SecondRoute>{
Image _image = Image.network('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg');
Future _handleImagePick(BuildContext context) async {
var imageFile = await ImagePicker.pickImage(source: ImageSource.gallery);
var image = Image.file(imageFile);
setState(() {
_image = image;
});
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints viewportConstraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: viewportConstraints.maxHeight,
),
child: IntrinsicHeight(
child: Column(
children: <Widget>[
Container(
// A fixed-height child.
color: const Color.fromARGB(255, 255, 255, 255),
height: 120.0,
),
Expanded(
// A flexible child that will grow to fit the viewport but
// still be at least as big as necessary to fit its contents.
child: Container(
color: const Color(0xffffffff),
height: 240.0,
constraints: BoxConstraints(
minWidth: viewportConstraints.maxWidth,
minHeight: double.infinity
),
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () {
_handleImagePick(context);
},
child: Text('Image Pick'),
),
_image,
],
),
),
),
],
),
),
),
);
},
);
}
}
2.Android
画像の初期表示には、Flutter Imageクラスのサンプル画像を表示。
「Image Pick」ボタン押下でギャラリーから画像を選択できる。
var imageFile = await ImagePicker.pickImage(source: ImageSource.gallery);
のImageSource を、ImageSource.camera に変更することで、カメラが起動する!
選択すると、Image コンポーネントに選択された画像がロードされる!
3.iOS
Androidに対応して、少し変更する必要がある。
info.plist(/ios/Runner) に以下を追記。それぞれの機能(key)を利用するときに、目的(string)を表示しユーザーに許可を求める。
<dict>
<key>NSPhotoLibraryUsageDescription</key>
<string>What purpose to use</string>
<key>NSCameraUsageDescription</key>
<string>What purpose to use</string>
<key>NSMicrophoneUsageDescription</key>
<string>What purpose to use</string>
<key>CFBundleDevelopmentRegion</key>
:
</dict>
エミュレーターで実行。Androidと同様に表示された。
「Image Pick」ボタンで、ユーザーに確認。OK押下。
ギャラリー?が表示されるので、画像を選択。
選択した画像が、表示された!
AndroidX対応で、結構はまったが、行けそうか!?
iOSについても勉強する必要あるな。
