Flutter : HTTP POSTと結果JSONの処理

Flutter + Firebase でアプリ作成のためのパーツあつめ。

1.ここまでに確認したこと

  1. Flutter+Firebase環境設定
  2. 画面遷移
  3. Dialog
  4. Httpクライアント
  5. AndroidX対応
  6. 画像の選択
  7. 画像の切り抜き

2.今回確認すること

  1. Image Pickボタン押下:画像を選択し、画像を画面に表示
  2. OCRボタン押下:dioパッケージ を使用して、HTTP POST で、OCRサービス(Google Cloud VIsioin API)に画像をアップロードし、結果をJOSNで得る
  3. 結果のJSONを処理してテキストに表示

3.ソース

3.1 pubspwc.yaml

dependencies:
   image_picker: ^0.6.1+8
   dio: ^3.0.3

3.2 テーマに該当する部分のみ抜粋。

  1. import 'dart:convert';
  2. import 'dart:io';
  3.  
  4. import 'package:flutter/material.dart';
  5. import 'package:image_picker/image_picker.dart';
  6. import 'package:dio/dio.dart';
  7.  
  8. class SecondRoute extends StatefulWidget {
  9. @override
  10. State<StatefulWidget> createState() {
  11. return _SecondRoute();
  12. }
  13. }
  14. class _SecondRoute extends State<SecondRoute>{
  15. Image _defaultImage = Image.network('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg');
  16. File _selectedFile;
  17. final _textController = TextEditingController();
  18.  
  19. @override
  20. void initState() {
  21. super.initState();
  22. // _textController.addListener(_ocrText);
  23. }
  24.  
  25. @override
  26. void dispose() {
  27. _textController.dispose();
  28. super.dispose();
  29. }
  30.  
  31. Future _handleImagePick(BuildContext context) async {
  32. var imageFile = await ImagePicker.pickImage(source: ImageSource.gallery);
  33. setState(() {
  34. _selectedFile = imageFile;
  35. });
  36. }
  37.  
  38. Future _handleOcr(BuildContext context) async {
  39. var dio = new Dio();
  40. var formData = new FormData.fromMap({
  41. "fileName": "ocrfile",
  42. "file": await MultipartFile.fromFile(_selectedFile.path ,filename: "selected_file")
  43. });
  44. var result = dio.post(
  45. "https://{google cloud vision api を実装したWebサービスアプリのURL}",
  46. options: Options(responseType: ResponseType.json),
  47. data: formData);
  48.  
  49. result.then((Response response){
  50. print("<status> ${response.statusCode}");
  51. response.headers.forEach((k, v){
  52. print("<header> $k:$v");
  53. });
  54. var json = response.data;
  55. print(json['text']);
  56. setState(() {
  57. _textController.text = json['text'];
  58. });
  59. });
  60. return null;
  61. }
  62.  
  63. @override
  64. Widget build(BuildContext context) {
  65. return Scaffold(
  66. body: LayoutBuilder(
  67. builder: (BuildContext context, BoxConstraints viewportConstraints) {
  68. return SingleChildScrollView(
  69. child: ConstrainedBox(
  70. constraints: BoxConstraints(
  71. minHeight: viewportConstraints.maxHeight,
  72. ),
  73. child: IntrinsicHeight(
  74. child: Column(
  75. children: <Widget>[
  76. Container(
  77. // A fixed-height child.
  78. color: const Color.fromARGB(255, 255, 255, 255),
  79. height: 120.0,
  80. ),
  81. Expanded(
  82. // A flexible child that will grow to fit the viewport but
  83. // still be at least as big as necessary to fit its contents.
  84. child: Container(
  85. color: const Color(0xffffffff),
  86. height: 240.0,
  87. constraints: BoxConstraints(
  88. minWidth: viewportConstraints.maxWidth,
  89. minHeight: double.infinity
  90. ),
  91. child: Column(
  92. children: <Widget>[
  93. RaisedButton(
  94. onPressed: () {
  95. _handleImagePick(context);
  96. },
  97. child: Text('Image Pick'),
  98. ),
  99. RaisedButton(
  100. onPressed: (){
  101. _handleOcr(context);
  102. },
  103. child: Text('OCR'),
  104. ),
  105. (_selectedFile == null)?_defaultImage:Image.file(_selectedFile),
  106. TextField(
  107. controller: _textController,
  108. minLines: 6,
  109. maxLines: 15,
  110. decoration: InputDecoration(
  111. border: OutlineInputBorder(),
  112. ),
  113. ),
  114. ],
  115. ),
  116. ),
  117. ),
  118. ],
  119. ),
  120. ),
  121. ),
  122. );
  123. },
  124. ),
  125. );
  126. }
  127.  
  128. }

4.実行

Image Pick で画像をロード

flutter_ocr01

OCRボタンで、画像をサービスに送信して、結果のJSONをテキストフィールドに表示

flutter_ocr02

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

前の記事

Flutter : 画像の切り抜き

次の記事

Flutter : sqliteの利用