flutter - 将数据库提供程序导入另一个文件提供程序 Dart

标签 flutter dart provider

我想在许多独立供应商文件中使用我的数据库连接供应商。

如何将我的 DBProvider (mainProvider.dart) 放入其中一个(即 langProvider.dart)

这是两者的代码。

ma​​inProvider.dart

class DBProvider{
  static Database? _database;
  static final DBProvider db = DBProvider._();

  DBProvider._();

  Future<Database> get database async{
    _database ??= await initDB();

    return _database!;
  }

  Future<Database> initDB() async{
    Directory documentDirectory = await getApplicationDocumentsDirectory();

    final path = join(documentDirectory.path, 'assets/database/myDB.db');
    await deleteDatabase(path);
    debugPrint(path);

    var existsDB = await databaseExists(path);

    if(!existsDB){
      try{
        await Directory(dirname(path)).create(recursive: true);
      } catch(_){}

      ByteData data = await rootBundle.load(join('assets/database/myDB.db'));
      List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);

      await File(path).writeAsBytes(bytes, flush: true);
    }

    var db = await openDatabase(path);
    return db;
  }
}

langProvider.dart

import 'package:flutter_demo_app/src/providers/provider.dart';
import 'package:flutter_demo_app/src/models/lang_model.dart';

  Future<List<langModel>> getAllLangs() async{
    Database db = await database;
    final result = await db.query('languages');

    return result.isNotEmpty ? result.map((langs) => langModel.fromJson(langs)).toList() : [];
  }

  Future<langModel?> getLangById(int id) async{
    Database db = await database;
    final result = await db.query('languages', where: 'id = ?', whereArgs: [id]);

    return result.isNotEmpty ? langModel.fromJson(result.first) : null;
  }

最佳答案

使用ProxyProviderDBProvider 设置为其他提供者。它将是这样的:

MultiProvider(providers: [
  Provider(create: (context) => DBProvider),
  ProxyProvider<DBProvider, LangProvider>(
    create: (context) => LangProvider(),
    update: (context, dbProvider, langProvider) =>
        langProvider..setDBProvider(dbProvider),
  ),
]),

在 LangProvider 中创建一个 setter 来接收 DBProvider:

  DBProvider? _dbProvider;

  void setDBProvider(DBProvider dbProvider) {
    _dbProvider = dbProvider;
  }  

  Future<List<langModel>> getAllLangs() async{
    Database db = await _dbProvider!.database;
    final result = await db.query('languages');

    return result.isNotEmpty ? result.map((langs) => langModel.fromJson(langs)).toList() : [];
  }

  Future<langModel?> getLangById(int id) async{
    Database db = await _dbProvider!.database;
    final result = await db.query('languages', where: 'id = ?', whereArgs: [id]);

    return result.isNotEmpty ? langModel.fromJson(result.first) : null;
  }

关于flutter - 将数据库提供程序导入另一个文件提供程序 Dart ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73515139/

相关文章:

java - j2me 中提供程序类的替代方案是什么

android-studio - ChangeNotifierProvider没有被调用

flutter - 如何自定义对话框的位置、大小和背景?

ListView 或 BLoC 的 Flutter 状态恢复

visual-studio-code - VSCode 突出显示 Flutter 错误,但 Android Studio 没有

dart - 如何在 Dart 中运行重复出现的函数?

带有提供程序模式的Flutter AnimatedList

flutter - 按下时无法更改收藏夹图标颜色

flutter - 更新到 Flutter 1.12.13 后,TextField 提示/输入文本在没有 prefixIcon 的情况下未居中

flutter - 如何在 Flutter 中正确重用 Provider