今日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戦国時代はこの目で見ることが出来そう。
そして俺もその戦渦に巻き込まれるかもしれない。せめて自分で舵を取りたいところ…