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

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

### 入力データを特定するために
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/40e6ea2e-9bdf-6e52-d05c-d4e3475bcf1b.png)

### Flutter でやってもらいたいことを指示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/2afa4e9e-bde6-615e-e9dc-6b9a21c74e04.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/7cfc90e4-bb02-434d-9a1b-ed3089ecb7f7.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/6bbae361-c40f-aab4-e8f8-76a19df51037.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/2235e71e-0b3a-f4e3-fac6-76593278d649.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/6ae33b8b-b8cd-7301-ff3e-15af865b22c3.png)

### 検証用データを獲得しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/bf7efa22-9e4f-4823-6d76-9998ac522b53.png)

```
［＃７号］［＃小見出し］トロイ戦争はことごとく嘘である［＃「トロイ戦争はことごとく嘘である」小見出し終わり］
［＃３号］［＃小見出し］ジャン・ジラウドゥ［＃「ジャン・ジラウドゥ」小見出し終わり］
［＃７号］［＃小見出し］原題　ＬＡ　ＧＵＥＲＲＥ　ＤＥ　ＴＲＯＩＥ　Ｎ＇ＡＵＲＡ　ＰＡＳ　ＬＩＥＵＥ［＃「原題　ＬＡ　ＧＵＥＲＲＥ　ＤＥ　ＴＲＯＩＥ　Ｎ＇ＡＵＲＡ　ＰＡＳ　ＬＩＥＵＥ」小見出し終わり］
［＃３号］［＃小見出し］邦訳　加藤恵三［＃「邦訳　加藤恵三」小見出し終わり］
［＃７号］［＃小見出し］第一幕［＃「第一幕」小見出し終わり］
［＃７号］［＃小見出し］［＃ページの左右中央］終戦前夜の市街戦［＃「終戦前夜の市街戦」ページの左右中央］［＃「終戦前夜の市街戦」小見出し終わり］
［＃７号］［＃小見出し］第二幕［＃「第二幕」小見出し終わり］
［＃７号］［＃小見出し］［＃ページの左右中央］トロイヤ戦争はあったか否か［＃「トロイヤ戦争はあったか否か」ページの左右中央］［＃「トロイヤ
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/0d44032f-30c1-4549-9738-a46a592c2eb5.png)
```
戦争はあったか否か」小見出し終わり］
［＃７号］［＃小見出し］第三幕［＃「第三幕」小見出し終わり］
［＃７号］［＃小見出し］［＃ページの左右中央］千年後のトロイヤ戦争［＃「千年後のトロイヤ戦争」ページの左右中央］［＃「千年後のトロイヤ戦争」小見出し終わり］
［＃７号］［＃小見出し］［＃ページの左右中央］あとがき［＃「あとがき」ページの左右中央］［＃「あとがき」小見出し終わり］
［＃改ページ］［＃７号］［＃小見出し］トロイ戦争はことごとく嘘である［＃「トロイ戦争はことごとく嘘である」小見出し終わり］
［＃３号］［＃小見出し］ジャン・ジラウドゥ［＃「ジャン・ジラウドゥ」小見出し終わり］
［＃７号］［＃小見出し］原題　ＬＡ　ＧＵＥＲＲＥ　ＤＥ　ＴＲＯＩＥ　Ｎ＇ＡＵＲＡ　ＰＡＳ　ＬＩＥＵＥ［＃「原題　ＬＡ　ＧＵＥＲＲＥ　ＤＥ　ＴＲＯＩＥ　Ｎ＇ＡＵＲＡ　ＰＡＳ　ＬＩＥＵＥ」小見出し終わり］
［＃３号］［＃小見出し］邦訳　加藤恵三［＃「邦訳　加藤恵三」小見出し終わり］
［＃７号］［＃小見出し］第一幕［＃「第一幕」小見出し終わり］
［＃７号］［＃小見出し］［＃ページの左右中央］終戦前夜の市街戦［＃「終戦前夜の市街戦」ページの左右中央］［＃「終戦前夜の市街戦」小見出し終わり］
［
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/962754c3-e9b6-cf68-a6e2-b431967b911d.png)