kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成@自動生成ツール作成中

19:10
①「ファイを開く」ボタンをやった。HTTP(これならSpringSecurity認証通る)でファイルをスマホに取り込んでから表示するようにした。頑張って、PDFの表示はOKレベルまでいった。しかし、拡張子txtは、表示されるけど、文字化けする。どうにもこうにも解決できない。ので、とりあえずこのまま先に進むことにする。

■「ファイルを開く」ボタンがある画面

■画面にある「ファイルを開く」ボタンと、押下後。拡張子PDFの場合。これはOK

■画面にある「ファイルを開く」ボタンと、押下後。拡張子TXTの場合。これはNG。だけど、とりあえずこのまま先に進む。ファイルがSJISやUTF8だったりするのはどうなるのかな。とりあえずどちらも漢字は文字化けする。UTF8の漢字は豆腐の絵(以下はUTF8を表示)になるけど、SJISはちょっと違う感じ。ほんとわからない。

「ファイルを開く」ボタンのための、flutter・スマホ側及びSpring・PC側。チェックして直した内容は以下

■使用できる項目情報一覧画面で「ファイルを開く」を押下したが、WEB側のログイン失敗画面が出る。
理由:WebViewConfigurationを使ってみたが、Headersにある認証情報が、何らかの理由で。Spring側にわたっていないと思われる。
 かつ、Spring側で認証エラーの時Flatter側に戻ってこないで、WEB側のログイン失敗画面になっている。
★1.修正対象:Flutter側ひな形。
・3_00_hinagata_List.txt及び、
 2_00_hinagata_Detail.txt 修正
<<追加 start>>
import '../../utils/pdf_txt_dsp_comm.dart';
<<追加 end>>

★2.修正対象:Flutter側ひな形。
・hinagata_ListlView_ファイル.txt 修正
<<修正前 start>>
                onPressed: (){CommUtils.launchInWebViewOrVC(context, 
                                Consts.myHttpUrl + '/upload/■{PRG_NAME}■/' + ■{PKEY_ITEM_NAME_VALUES_LISTVIEW}■ '/' + element["■{ITEM_NAME}■"] + '?' + DateFormat('yyyyMMddHHmmss').format(DateTime.now()), 
                                widget.headers);},
<<修正前 end>>
<<修正後 start>>
                onPressed: () async {
                  var _httpClient = http.Client();
                  final http.Response res = await _httpClient.get(Uri.parse(Consts.myHttpUrl + '/upload/■{PRG_NAME}■/' + ■{PKEY_ITEM_NAME_VALUES_LISTVIEW}■ '/' + element["■{ITEM_NAME}■"] + '?' + DateFormat('yyyyMMddHHmmss').format(DateTime.now()),
                      headers: widget.headers);
                  if (res.statusCode != 200) {
                    String? _str = await CommUtils.openDialogOkComm(context, 'ファイルを読み込めませんでした。') ;
                  } else {
                    String _extension = (element["■{ITEM_NAME}■"] as String).toLowerCase().substring((element["■{ITEM_NAME}■"] as String).length - 3);
                    if (_extension=="txt" || _extension=="pdf") { // Spring側で、txt、pdfしか入力OKにしていないので、これ以外はありえないのだけどチェックする。
                      Uint8List? _pdfData;
                      String _data = "";
                      if (_extension=="txt") {
                        _data = String.fromCharCodes(res.bodyBytes);
                      } else {
                        _pdfData = res.bodyBytes;
                      }
                      Navigator.of(context).push(
                        MaterialPageRoute(
                          builder: (context) =>
                              PdfTxtDspComm(extension: _extension,
                                  pdfData: _pdfData,
                                  txtData: _data),
                        ),
                      );
                    }
                  }
                },
<<修正後 end>>

★3.修正対象:Flutter側ひな形。
・hinagata_DetailView_ファイル.txt 修正
<<修正前 start>>
                onPressed: (){CommUtils.launchInWebViewOrVC(context, 
                                Consts.myHttpUrl + '/upload/■{PRG_NAME}■/' + ■{PKEY_ITEM_NAME_VALUES}■ '/' + _■{PRG_NAME}■Form.resDetailMapForm["■{ITEM_NAME}■"] + '?' + DateFormat('yyyyMMddHHmmss').format(DateTime.now()), 
                                widget.headers);},
<<修正前 end>>
<<修正後 start>>
                onPressed: () async {
                  var _httpClient = http.Client();
                  final http.Response res = await _httpClient.get(Uri.parse(Consts.myHttpUrl + '/upload/■{PRG_NAME}■/' + ■{PKEY_ITEM_NAME_VALUES_DETAILVIEW}■ '/' + _■{PRG_NAME}■Form.resDetailMapForm["■{ITEM_NAME}■"] + '?' + DateFormat('yyyyMMddHHmmss').format(DateTime.now())), 
                      headers: widget.headers);
                  if (res.statusCode != 200) {
                    String? _str = await CommUtils.openDialogOkComm(context, 'ファイルを読み込めませんでした。') ;
                  } else {
                    String _extension = (_■{PRG_NAME}■Form.resDetailMapForm["■{ITEM_NAME}■"] as String).toLowerCase().substring((_■{PRG_NAME}■Form.resDetailMapForm["■{ITEM_NAME}■"] as String).length - 3);
                    if (_extension=="txt" || _extension=="pdf") { // Spring側で、txt、pdfしか入力OKにしていないので、これ以外はありえないのだけどチェックする。
                      Uint8List? _pdfData;
                      String _data = "";
                      if (_extension=="txt") {
                        _data = String.fromCharCodes(res.bodyBytes);
                      } else {
                        _pdfData = res.bodyBytes;
                      }
                      Navigator.of(context).push(
                        MaterialPageRoute(
                          builder: (context) =>
                              PdfTxtDspComm(extension: _extension,
                                  pdfData: _pdfData,
                                  txtData: _data),
                        ),
                      );
                    }
                  }
                },
<<修正後 end>>

★4.PDF及びTXTの内容表示画面新規作成。pdf_txt_dsp_comm.dart 新規作成
<<追加 start>>
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';

/// PdfTxt画面
class PdfTxtDspComm extends StatefulWidget {
  final String? extension;
  final Uint8List? pdfData;
  final String txtData;

  const PdfTxtDspComm({Key? key, required this.extension, required this.pdfData,
    required this.txtData}) : super(key: key);
  @override
  State<PdfTxtDspComm> createState() => _PdfTxtDspCommState();
}

class _PdfTxtDspCommState extends State<PdfTxtDspComm> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('内容表示',
            overflow: TextOverflow.clip,
            style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
        centerTitle:true,
        backgroundColor: Colors.green,
      ),
      body: _makeWidget()
    );
  }

  // 表示するWidgets
  Widget _makeWidget() {
    Widget contentWidget;
    if (widget.extension=="pdf") {
      contentWidget = (
        SizedBox(
          height: MediaQuery
              .of(context)
              .size
              .height,
          child: PDFView(
            pdfData: widget.pdfData,
          ),
        )
      );
    } else {
      contentWidget = (
        SingleChildScrollView(
          child:Padding(
            padding: const EdgeInsets.all(8),
            child:Text(widget.txtData,
            ),
          ),
        )
      );
    }
    return contentWidget;
  }
}
<<追加 end>>

★5.pubspec.yaml
  flutter_pdfview: ^1.2.2

★6.webview_flutterのための設定
  android/app/build.gradle 修正
buildscript {
    ext.kotlin_version = '1.6.10'
    repositories {
        google()
        mavenCentral()
<<追加 start>>
        jcenter()
<<追加 end>>
    }
・・・
allprojects {
    repositories {
        google()
        mavenCentral()
<<追加 start>>
        jcenter()
<<追加 end>>
    }

★7.Android 12 SDK をインストールする。webview_flutterはAndroid 12 SDKが必要らしい。
	Android Studio で次の手順を実施することにより、Android 12 SDK をインストールできます。
	[Tools] > [SDK Manager] をクリックします。
	[SDK Platforms] タブで、[Android 12] を選択します。
	[SDK Tools] タブで、[Android SDK Build-Tools 31] を選択します。
	[OK] をクリックすると、SDK がインストールされます。
	これはやらないほうがいいかもその後、ターミナルで「flutter upgrade」する。

■2022/06/15に、勉強した成果:『Flutter_JavaSpringプログラム自動作成◎自動生成ツール』をVectorに載せました。Zenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
Vector
www.vector.co.jp
・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev