LoginSignup
0
0

More than 1 year has passed since last update.

GPT-4 をステップバイステップで使って Flutter のコードを生成させてみる

Posted at

ためしにやってみました。
対話しながらプログラムを組む、そしてテストをしてみる、そのはじめとして。

入力データを特定するために

image.png

Flutter でやってもらいたいことを指示する

image.png

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3
  path_provider: ^2.0.8
  archive: ^3.1.6

image.png

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:archive/archive.dart';

Future<String> downloadAndExtract(String url) async {
  final response = await http.get(Uri.parse(url));

  if (response.statusCode == 200) {
    Uint8List data = response.bodyBytes;

    final archive = ZipDecoder().decodeBytes(data);

    final outputDir = await getApplicationDocumentsDirectory();

    ArchiveFile targetFile;

    for (final file in archive) {
      if (file.name.endsWith('.txt')) {
        targetFile = file;
        break;
      }
    }

    if (targetFile != null) {
      List<String> lines = utf8.decode(targetFile.content).split('\n');
      return lines.take(50).join('\n');
    } else {
      throw Exception('No text file found in the archive.');
    }
  } else {
    throw Exception('Failed to download and extract file.');
  }
}

image.png

import 'package:flutter/material.dart';
import 'download_and_extract.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _displayText = '';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Aozora Downloader'),
        ),
        body: SingleChildScrollView(
          padding: EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  final url =
                      'https://www.ao

image.png

                .gr.jp/cards/000123/files/59195_ruby_61170.zip';
                  try {
                    String text = await downloadAndExtract(url);
                    setState(() {
                      _displayText = text;
                    });
                  } catch (e) {
                    print('Error: $e');
                  }
                },
                child: Text('ダウンロードして解凍する'),
              ),
              SizedBox(height: 16),
              Text(_displayText),
            ],
          ),
        ),
      ),
    );
  }
}

image.png

検証用データを獲得しておく

image.png

[#7号][#小見出し]トロイ戦争はことごとく嘘である[#「トロイ戦争はことごとく嘘である」小見出し終わり]
[#3号][#小見出し]ジャン・ジラウドゥ[#「ジャン・ジラウドゥ」小見出し終わり]
[#7号][#小見出し]原題 LA GUERRE DE TROIE N'AURA PAS LIEUE[#「原題 LA GUERRE DE TROIE N'AURA PAS LIEUE」小見出し終わり]
[#3号][#小見出し]邦訳 加藤恵三[#「邦訳 加藤恵三」小見出し終わり]
[#7号][#小見出し]第一幕[#「第一幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]終戦前夜の市街戦[#「終戦前夜の市街戦」ページの左右中央][#「終戦前夜の市街戦」小見出し終わり]
[#7号][#小見出し]第二幕[#「第二幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]トロイヤ戦争はあったか否か[#「トロイヤ戦争はあったか否か」ページの左右中央][#「トロイヤ

image.png

戦争はあったか否か」小見出し終わり]
[#7号][#小見出し]第三幕[#「第三幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]千年後のトロイヤ戦争[#「千年後のトロイヤ戦争」ページの左右中央][#「千年後のトロイヤ戦争」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]あとがき[#「あとがき」ページの左右中央][#「あとがき」小見出し終わり]
[#改ページ][#7号][#小見出し]トロイ戦争はことごとく嘘である[#「トロイ戦争はことごとく嘘である」小見出し終わり]
[#3号][#小見出し]ジャン・ジラウドゥ[#「ジャン・ジラウドゥ」小見出し終わり]
[#7号][#小見出し]原題 LA GUERRE DE TROIE N'AURA PAS LIEUE[#「原題 LA GUERRE DE TROIE N'AURA PAS LIEUE」小見出し終わり]
[#3号][#小見出し]邦訳 加藤恵三[#「邦訳 加藤恵三」小見出し終わり]
[#7号][#小見出し]第一幕[#「第一幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]終戦前夜の市街戦[#「終戦前夜の市街戦」ページの左右中央][#「終戦前夜の市街戦」小見出し終わり]
[

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0