Flutter ChatGPT(GPT-4)すごすぎる件

今日GPT-4が出たってことで(?)ツイッターでも俄に盛り上がりを見せていたので、自分も帰宅してからサクッと20ドル課金して使ってみました


感想としては、ものすごいなってこと…

簡単にTODOアプリが作れた。

main.dart

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';

import 'todo.dart';

final todoListProvider = StateNotifierProvider<TodoListNotifier, List<Todo>>((ref) => TodoListNotifier());

class TodoListNotifier extends StateNotifier<List<Todo>> {
  late Database _db;

  TodoListNotifier() : super([]) {
    initDatabase();
  }

  Future<void> initDatabase() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, 'todos.db');
    _db = await openDatabase(
      path,
      version: 1,
      onCreate: (Database db, int version) async {
        await db.execute('CREATE TABLE todos (id INTEGER PRIMARY KEY, task TEXT, dateTime TEXT)');
      },
    );
    fetchTodos();
  }

  Future<void> fetchTodos() async {
    List<Map<String, dynamic>> maps = await _db.query('todos');
    state = List.generate(maps.length, (i) => Todo.fromMap(maps[i]));
  }

  Future<void> addTask(String task) async {
    int id = DateTime.now().millisecondsSinceEpoch;
    String dateTime = DateTime.now().toString();

    await _db.insert('todos', {'id': id, 'task': task, 'dateTime': dateTime});
    fetchTodos();
  }

  Future<void> removeTask(int id) async {
    await _db.delete('todos', where: 'id = ?', whereArgs: [id]);
    fetchTodos();
  }
}

void main() {
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ToDo App with Riverpod',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ToDoApp(),
    );
  }
}

class ToDoApp extends ConsumerWidget {
  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final todoList = ref.watch(todoListProvider);

    return Scaffold(
      appBar: AppBar(title: Text('ToDo App with Riverpod')),
      body: ListView.builder(
        itemCount: todoList.length,
        itemBuilder: (context, index) {
          final todo = todoList[index];
          return ListTile(
            title: Text(todo.task),
            subtitle: Text('Created: ${todo.dateTime}'),
            trailing: IconButton(
              icon: Icon(Icons.delete),
              onPressed: () {
                ref.read(todoListProvider.notifier).removeTask(todo.id);
              },
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          showDialog(
            context: context,
            builder: (context) => AlertDialog(
              title: Text('Add a new task'),
              content: TextField(controller: _controller),
              actions: [
                TextButton(
                  onPressed: () {
                    if (_controller.text.isNotEmpty) {
                      ref.read(todoListProvider.notifier).addTask(_controller.text);
                      _controller.clear();
                    }
                    Navigator.of(context).pop();
                  },
                  child: Text('Add'),
                ),
              ],
            ),
          );
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

todo.dart

class Todo {
  final int id;
  final String task;
  final String dateTime;

  Todo({required this.id, required this.task, required this.dateTime});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'task': task,
      'dateTime': dateTime,
    };
  }

  factory Todo.fromMap(Map<String, dynamic> map) {
    return Todo(
      id: map['id'],
      task: map['task'],
      dateTime: map['dateTime'],
    );
  }
}

これで日時込みで、端末にTODO保存できるアプリが作れた。ものの10分くらい。
もっと上手に仕様を伝えることができれば、さらに時間を短縮できるだろうし、
色々機能もつけられるはず。タグ付けするとか。


これ遊ばない手はないな。エンジニアの定義が変わりそう、コードを書くと言うより、書いてもらって実装する感じになる予感がする。

時代の流れがきてる。

検索エンジン戦国時代はみたことなかったが(感知出来なかった)OpenAI戦国時代はこの目で見ることが出来そう。

そして俺もその戦渦に巻き込まれるかもしれない。せめて自分で舵を取りたいところ…

コメントを残す

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