错误:在Flutter Web中未找到'dart:ffi'。

6

在报告之前请仔细阅读。

我的Flutter Web项目一开始运行得非常好。几个小时后,它开始抱怨“dart:ffi”,而我甚至没有导入它。我看到了类似的问题,但都不是我的情况。我尝试了我能找到的所有方法,但都没有起作用。以下是错误信息:

/C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/drift-1.7.1/lib/src/sqlite3/database_tracker.dart:1:8: Error: Not found: 'dart:ffi'
import 'dart:ffi';
       ^

/C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3-1.8.0/lib/src/ffi/api/database.dart:1:8: Error: Not found: 'dart:ffi'
import 'dart:ffi';
       ^
/C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3-1.8.0/lib/src/ffi/api/statement.dart:1:8: Error: Not found: 'dart:ffi'
import 'dart:ffi';
       ^

/C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3-1.8.0/lib/open.dart:5:8: Error: Not found: 'dart:ffi'
import 'dart:ffi';
       ^
...
                                          
Failed to compile application.
Exited (sigterm)

我无法包含整个调试控制台的输出,但这是顶部和底部行。

请帮忙,谢谢。


您正在使用 sqlite3,但它在 Web 上不受支持 - https://pub.dev/packages/sqlite3 - Tirth Patel
我该如何摆脱它?因为我从未使用过它,而且似乎有很多带有“sqlite3”标签的文件和文件夹。 - Mamoudou Kane
你是否正在使用依赖于 sqlite3 的包/插件? - Tirth Patel
我不这么认为,说实话我从未听说过SQLite3。 我的代码突然停止工作了。 - Mamoudou Kane
我解决了。我只是删除了“web_ffi”文件夹,然后它就奇迹般地起作用了。 - Mamoudou Kane
有人有真正的答案吗?我也遇到了同样的问题!(我在不同的文件上得到相同的错误(....../aes_decrypt.dart:1:8: 错误:未找到:'dart:ffi' import 'dart:ffi';) - Felix
7个回答

8
在我的情况下,import 'dart:ffi' 自动地被我的IDE添加到我的项目中。我只需使用IDE的搜索功能查找并删除该导入语句。

3

我刚刚遇到了这个错误,并在所有的小部件文件中删除了所有未使用的导入项,错误就不再出现了。希望这能解决你的问题。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - V-rund Puro-hit
太好了,完美地解决了! - undefined

2

实际上,我也遇到了这个错误。然而,之前的解决方案都没有帮助到我。我花了几个小时最终明白了,我是在 Web 上下文中进行本地导入操作。

步骤 1:我的 pubsec 中适用于 Web 和 Android 的依赖项

#SQLITE with moore for all platforms
moor: ^4.6.0+1
moor_flutter: ^4.0.0
ffi: ^1.1.2
# for sqlite on android
sqlite3_flutter_libs:

步骤2:根据平台注入我的数据库对象

service_locator.dart是我在项目中用来注入所有依赖项(数据库、Rest Api客户端等)的文件;你自己可能有另一个名称。

这是我的service_locator.dart的内容:

export 'unsupported.dart'
if (dart.library.ffi) 'service_locator_native.dart'
if (dart.library.html) 'service_locator_web.dart';

正如您所看到的,如果平台是Android,则会导入本地代码;否则,如果是Web,则会导入Web库。

这是service_locator_web.dart的示例:

    import 'dart:async';    
    import 'package:get_it/get_it.dart';
    import 'package:my_app/src/dao/chat_channel_dao.dart';//database class
    import 'package:drift/web.dart';//only for the web
        
    final GetIt serviceLocator = GetIt.instance;    
    initLocator() {
    ...
    //Environment Settings
    ...    
     //DAO Injection
     serviceLocator.registerLazySingleton<ChatContactDao>(() => ChatChannelDao(WebDatabase('db_chat_channels')));
     ...
    }
    //to fake the interpreter to see service_locator like an getIt Instance
    T get<T extends Object>() {
      return serviceLocator.get<T>();
    }
    
    registerLazySingleton<T extends Object>(T Function() function){
      serviceLocator.registerLazySingleton<T>(function);
    }

FutureOr unregister<T extends Object>({
  Object? instance,
  String? instanceName,
  FutureOr Function(T)? disposingFunction,
}){
  return serviceLocator.unregister<T>();
}

这是 service_locator_native.dart 的示例:

import 'dart:async';    
import 'package:get_it/get_it.dart';
import 'package:my_app/src/dao/chat_channel_dao.dart';//database class
import 'package:drift/native.dart';//only for the native platform
    
final GetIt serviceLocator = GetIt.instance;
    
initLocator() {
...
//Environment Settings
...
//DAO Injection
serviceLocator.registerLazySingleton<ChatContactDao>(
          () => ChatChannelDao(makeLazyDb('db_chat_channels.sqlite')));//here for native DB
...
}

//to fake the interpreter to see service_locator like an getIt Instance
T get<T extends Object>() {
  return serviceLocator.get<T>();
}
registerLazySingleton<T extends Object>(T Function() function){
  serviceLocator.registerLazySingleton<T>(function);
}
// to call native Db Builder
LazyDatabase makeLazyDb(String dbName){
final db = LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, dbName));
return NativeDatabase(file);
});
  return db;

}

对于不支持的平台,这是 unsupported.dart 的代码:

import 'dart:async';

T get<T extends Object>()  => throw UnimplementedError();
initLocator() => throw UnimplementedError();
registerLazySingleton<T extends Object>(T Function() function)=> throw UnimplementedError();


FutureOr unregister<T extends Object>() => throw UnimplementedError();

步骤三:调用我的数据库类

   import 'package:my_app/src/service/service_locator.dart' as serviceLocator;
    class my_sample_ui{
    my_sample_method(EntityChatChannel myEntity) async{
    var ticketDao = serviceLocator.get<TicketDao>();
        await chatChannelDao?.createNew(myEntity);
    }
//implements your own methods
}

结论: 这只是一个设计模式,可以根据您的代码结构进行调整。在此示例中,我使用GetIt来实现类之间的依赖注入。Flutter是一个出色的多平台框架,但我们需要编写多平台代码以确保它在所有环境中都能正常工作。


0

您可以将鼠标悬停在import 'dart:ffi';上并删除它。

/C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/drift-1.7.1/lib/src/sqlite3/database_tracker.dart:1:8: 错误:找不到:'dart:ffi'

然后按下Windows上的ctrl键并单击左键,这将带您到错误位置,在顶部您将找到import 'dart:ffi',请将其删除或注释掉。


0
在终端上键入 flutter install dart:ffi 如果您遇到此错误,我认为这将有所帮助。

你好,答案不正确。在Dart中使用ffi时,不需要将dart:ffi安装为应用程序。 - heralight

0
我不知道它是否适用于所有情况,但是我只删除了'dart:ffi'的导入,就可以运行了。

-4
我解决了。我只是删除了“web_ffi”文件夹,然后它就奇迹般地工作了。

1
我没有找到web_ffi,它在哪里? - Boy
是的,我也找不到“web_ffi”。 - ᴅ ᴇ ʙ ᴊ ᴇᴇ ᴛ
另外,我没有找到“web_ffi”文件夹。 - Suhaib Raadan

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