ちょっとは技術記事っぽく?
今の私の最大の問題は、mysql_clientには、写経できる「使ってみた」情報が完全にゼロだということ。なので
- mysql1 vs mysql_client徹底比較
と言ったって、パッケージの中身を読み解く能力はないので、あくまで表面的。まずpuv.devページのexampleを左右に並べて、書き方の違いを検討する。
例えば
- mysql1ではconn.queryだけど
- mysql_clientではconn.executeだな
みたいな。 それが本質的な問題か、作者の書き癖なのかもわからないけれども、ともかく違ってるところ全部にマーカーを引く。
次は、mysql1でメンターさんにつくってもらった、IntelMacAirのMySQL5.7で動作確認済みのコードを、ごく単純に、表面的にmysql_clientの用語に変えて、m1macに書いてみる。
まず接続用にmysql.dart
import 'package:mysql_client/mysql_client.dart';
class Mysql {
static String
host = 'localhost',
user = 'dongri727',
password = '********',
db = 'aetatum';
static int port = 3306;
Mysql();
Future getConnection() async {
print("connecting to server");
final conn = await MySQLConnection.createConnection(
host: host,
port: port,
userName: user,
password: password,
databaseName: db,
);
await conn.connect();
print("connected");
}
}
至極あっさりできあがって、エラーはない。
次、Flutterでおなじみカウンターアプリを改造したmain.dart。
import 'package:flutter/material.dart';
import 'mysql.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter MySQL Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: const MyHomePage(title: 'Flutter MySQL Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var liaison = Mysql();
var name = '';
void _getName() {
print('je suis la');
liaison.getConnection().then((conn) async {
print('ca marche?');
var result = await conn.execute("SELECT name FROM timeline WHERE id = 1");
for (final row in result.rows) {
print('row.assoc()');
setState((){
print('dis moi');
name = row[0];
});
}
});
//conn.close();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'push button to find events',
),
Text(
style: Theme.of(context).textTheme.headline4,
name,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _getName,
tooltip: 'vas-y!',
child: const Icon(Icons.add),
),
);
}
}
まず、関数の終わりのconn.closeにエラーが出た。then((conn)...やconn.executeはいいのに、なんでconn.closeの時だけindefinedと言われるのかわからない。ただ、これはコメントアウトしておいてもとりあえずなんとかなるので、消しておく。
さあ、debugしてみよう。
- connecting to server
- connected
繋がった、MySQL8に繋がってるよ!
でも・・・
consoleにca march?(動いてる?)と表示されたところで止まる。そして
- NoSuchMethodError:
- The method 'execute' was called on null.
Receiver: null
Tried calling: execute("SELECT name FROM timeline WHE....
- The method 'execute' was called on null.
と、エラーメッセージが出る。つまりselect文が気に入らない。nullを呼んでるって? ある意味、mysql1でMySQL8に繋いでいたときと似ている。つまり、繋がるけど、クエリ文が気に入らない。
でも、まだ変更の余地がある。
- 今、シンプルに void _getName() {
と書いているところを、mysql_clientのexampleに倣って次のように直す。
- void _getName(List<*String*>arguments) async {
(ほんとは*はないんだけれど、なぜかこうしないとStringが消えてしまう)
すると今度はコード上にエラーが出た。
- The argument type 'void Function(List<*String*>)' can't be assigned to the parameter type 'void Function()?'.
おお、お初にお目にかかるエラーです。ググったら
- VoidCallback?
とか、いろいろ出てきたけど、わからないの上塗りになりそうなので、今日はここで止まることにする。少なくとも
これは私のFlutter知識の不足による問題である。
といえるので、たぶん、配列とかリストとか、mapとか、その辺、勉強しなさいよ、と言うことだろう。mysql_clientやMySQL8の問題ではない、と信じて、明日もがんばろう。