DART / FLUTTER — Как использовать переменную MySqlConnection в другом методе?

#mysql #flutter #oop #dart

#mysql #flutter #ооп #dart

Вопрос:

Я немного застрял на получении переменной «conn» в «insertregistration», чтобы я записывал соединение с базой данных только один раз и не повторял его для каждого запроса.

 import 'dart:async';
import 'package:mysql1/mysql1.dart';

class Database {
  MySqlConnection conn;
  connection() async {
       conn = await MySqlConnection.connect(ConnectionSettings(
        host: 'x',
        port: x,
        user: 'x',
        db: 'x',
        password: 'x'));
  }

  dynamic insertregistration(String username, String password, String email, String nome, String nascita) async {

    conn = connection().conn;
    var result = await conn.query('insert into user (username,password,email,nome,nascita,iscrizione) values (?, ?, ?, ?, ?, ?)', ['$username', '$password', '$email', '$nome', '$nascita', '2020-10-21']);

    await conn.close();
}
}
  

Это было одно из моих многих опробованных решений, но, очевидно, оно не работает

Как я могу сделать? Заранее спасибо 🙂

Ответ №1:

Я бы предложил преобразовать класс базы данных в одноэлементный.

Чтобы решить вашу проблему, вам нужно вызвать connection и дождаться его, а затем выполнить запрос.

   dynamic insertregistration(String username, String password, String email, String nome, String nascita) async {
    await this.connection();

    var result = await conn.query('insert into user (username,password,email,nome,nascita,iscrizione) values (?, ?, ?, ?, ?, ?)', ['$username', '$password', '$email', '$nome', '$nascita', '2020-10-21']);

    await conn.close();
  }
  

Для одноэлементной реализации я бы выбрал что-то вроде этого:

 import 'dart:async';
import 'package:mysql1/mysql1.dart';

class Database {
  
  MySqlConnection conn;
  
  Database._privateConstructor() {
  }

  static final Database instance = Database._privateConstructor();
  
  Future<void> initConnection() async {
       this.conn = await MySqlConnection.connect(ConnectionSettings(
        host: 'x',
        port: x,
        user: 'x',
        db: 'x',
        password: 'x'));
  }

  dynamic insertregistration(String username, String password, String email, String nome, String nascita) async {

    await this.initConnection();
    
    var result = await this.conn.query(
      'insert into user (username,password,email,nome,nascita,iscrizione) values (?, ?, ?, ?, ?, ?)',
      ['$username', '$password', '$email', '$nome', '$nascita', '2020-10-21']
    );

    await conn.close();
  }
}
  

И для использования синглтона вы будете использовать его следующим образом:

 Database.instance.insertRegistration(sername, password, email, nome, nascita);