Flutter : HTTP POSTと結果JSONの処理
Flutter + Firebase でアプリ作成のためのパーツあつめ。
1.ここまでに確認したこと
2.今回確認すること
- Image Pickボタン押下:画像を選択し、画像を画面に表示
- OCRボタン押下:dioパッケージ を使用して、HTTP POST で、OCRサービス(Google Cloud VIsioin API)に画像をアップロードし、結果をJOSNで得る
- 結果のJSONを処理してテキストに表示
3.ソース
3.1 pubspwc.yaml
dependencies:
image_picker: ^0.6.1+8
dio: ^3.0.3
3.2 テーマに該当する部分のみ抜粋。
- import 'dart:convert';
- import 'dart:io';
- import 'package:flutter/material.dart';
- import 'package:image_picker/image_picker.dart';
- import 'package:dio/dio.dart';
- class SecondRoute extends StatefulWidget {
- @override
- State<StatefulWidget> createState() {
- return _SecondRoute();
- }
- }
- class _SecondRoute extends State<SecondRoute>{
- Image _defaultImage = Image.network('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg');
- File _selectedFile;
- final _textController = TextEditingController();
- @override
- void initState() {
- super.initState();
- // _textController.addListener(_ocrText);
- }
- @override
- void dispose() {
- _textController.dispose();
- super.dispose();
- }
- Future _handleImagePick(BuildContext context) async {
- var imageFile = await ImagePicker.pickImage(source: ImageSource.gallery);
- setState(() {
- _selectedFile = imageFile;
- });
- }
- Future _handleOcr(BuildContext context) async {
- var dio = new Dio();
- var formData = new FormData.fromMap({
- "fileName": "ocrfile",
- "file": await MultipartFile.fromFile(_selectedFile.path ,filename: "selected_file")
- });
- var result = dio.post(
- "https://{google cloud vision api を実装したWebサービスアプリのURL}",
- options: Options(responseType: ResponseType.json),
- data: formData);
- result.then((Response response){
- print("<status> ${response.statusCode}");
- response.headers.forEach((k, v){
- print("<header> $k:$v");
- });
- var json = response.data;
- print(json['text']);
- setState(() {
- _textController.text = json['text'];
- });
- });
- return null;
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- body: 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'),
- ),
- RaisedButton(
- onPressed: (){
- _handleOcr(context);
- },
- child: Text('OCR'),
- ),
- (_selectedFile == null)?_defaultImage:Image.file(_selectedFile),
- TextField(
- controller: _textController,
- minLines: 6,
- maxLines: 15,
- decoration: InputDecoration(
- border: OutlineInputBorder(),
- ),
- ),
- ],
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- );
- },
- ),
- );
- }
- }
4.実行
Image Pick で画像をロード
OCRボタンで、画像をサービスに送信して、結果のJSONをテキストフィールドに表示