如何在Flutter Web中使用getApplicationDocumentsDirectory()函数

7
我是flutter的初学者,想在我的Flutter应用程序中使用sqflite包来使用SQlite数据库。由于模拟器无法正常工作,我将我的flutter app运行在chrome上。我在代码中使用getApplicationDocumentsDirectory,但是出现了一个错误:

Error: MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)

我在一篇文章中读到:

我在将Web支持添加到应用程序之后遇到了这个问题。 getApplicationDocumentsDirectory函数仅支持iOS和Android(文档)。 我增加了对Web的检查,并更改了设置目录的方式,这为我解决了“没有找到方法的实现”的问题。

要确定平台是否为Web,请使用Flutter的kIsWeb:

Then handle setting the directory accordingly:

if (kIsWeb) {
    // Set web-specific directory
} else {
    appDocumentDirectory = await path_provider.getApplicationDocumentsDirectory();
}

但我不知道如何设置特定于web的目录。
我的代码是:
    if (_database != null) {
      return _database;
    }
    _database = await _initializeDatabase();
    return _database;
  }

  Future<Database> _initializeDatabase() async {
    Directory directory = await getApplicationDocumentsDirectory();
    String path = join(directory.path, 'annonce_database.db');
    return await openDatabase(path, version: _dbVersion, onCreate: _onCreate);
  }```
2个回答

6

在Web上,getApplicationDocumentsDirectory()无法使用,因此需要修改_initializeDatabase()函数并替换为字符串路径路由以便在Web中使用(例如项目内的assets文件夹)。

不要忘记导入KIsWeb。

import 'package:flutter/foundation.dart' show kIsWeb;
...
Future<Database> _initializeDatabase() async {
//here
    if (kIsWeb) {
        String path = "/assets/db";
    } else {
        Directory directory = await getApplicationDocumentsDirectory();
        String path = join(directory.path, 'annonce_database.db');
    }
    return await openDatabase(path, version: _dbVersion, onCreate: _onCreate);
}

3

遇到了相同的问题。

Web Build Error:  Uncaught (in promise) Error: MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)

实际代码

final appDocDir = await getApplicationDocumentsDirectory();

  // Initialize hive.
  await Hive.initFlutter();

  // Register Adapters.
  Hive
    ..init(appDocDir.path)
    ..registerAdapter(ActivityAdapter())
    ..registerAdapter(ActivityTypeModelAdapter());

使用 kIsWeb 修复后

var path = "/assets/db";
if (!kIsWeb) {
  var appDocDir = await getApplicationDocumentsDirectory();
  path = appDocDir.path;
}

// Initialize hive.
await Hive.initFlutter();

// Register Adapters.
Hive
  ..init(path)
  ..registerAdapter(ActivityAdapter())
  ..registerAdapter(ActivityTypeModelAdapter());

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接