初心者　MySQL8に挑戦する 18

# ちょっとは技術記事っぽく？

　今の私の最大の問題は、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....

と、エラーメッセージが出る。つまり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の問題ではない、と信じて、明日もがんばろう。

https://qiita.com/dongri727/items/ca9c12f082254365fa91

https://qiita.com/dongri727/items/c8799f1ab84dfc6acd9f