[在我的应用程序中,我正在使用sembast
db,并且我试图使AppDatabase
单例类适应于平台,并在应用程序在网络上运行时使用sambast_web
。我正在尝试使用与用户位置相同的模式,因此创建了:
abstract class AppDatabase
可以在导入存根时为设备和Web包提供条件包导入,并且在类工厂方法中返回存根getter方法。class AppDatabaseDevice
的[A class AppDatabaseWeb
和AppDatabase
。运行应用程序面团时出现错误:
Compiler message:
lib/fixit_shop_app/database/app_database_switcher.dart:50:28: Error: Method not found: 'getAppDatabase'.
factory AppDatabase() => getAppDatabase();
^^^^^^^^^^^^^^
Target kernel_snapshot failed: Exception: Errors during snapshot creation: null
Failed to build bundle.
Error launching application on iPad (6th generation).
现在,这很奇怪,因为在为抽象类工厂编写代码时发现getAppDatabase()
没有错误。
在稍微纠结了代码之后,我确定了问题是存根导入的条件导入。
如果我不带条件导入而将其导入为>>
import 'package:fixit_shop_flutter/fixit_shop_app/database/app_database_stub.dart';
然后我没有收到任何错误,但是我再次需要条件导入。。
您能找出为什么条件导入对该类失败而对另一类有用吗?
一如既往,非常感谢您的时间和帮助。这些是AppDatabase方法:
import 'app_database_switcher.dart';
AppDatabase getAppDatabase() => throw UnsupportedError(
'Cant get AppDatabase if not loading the right package');
import 'dart:async';
import 'package:sembast/sembast.dart';
import 'app_database_stub.dart'
if (dart.library.io) 'package:sembast/sembast.dart'
if (dart.library.js) 'package:sembast_web/sembast_web.dart';
abstract class AppDatabase {
// Singleton instance
static final AppDatabase _singleton;
// Singleton accessor
static AppDatabase get instance => _singleton;
// Completer is used for transforming synchronous code into asynchronous code.
Completer<Database> _dbOpenCompleter;
// A private constructor. Allows us to create instances of AppDatabase
// only from within the AppDatabase class itself.
// Sembast database object
Database _database;
// Database object accessor
Future<Database> get database async {
// // If completer is null, AppDatabaseClass is newly instantiated, so database is not yet opened
return _dbOpenCompleter.future;
}
factory AppDatabase() => getAppDatabase();
}
这是用户定位方法:
import 'package:fixit_shop_flutter/fixit_shop_app/platform_user_location/user_location_switcher.dart';
UserLocation getUserLocation() =>
throw UnsupportedError('user_location_stub error');
import 'package:fixit_shop_flutter/fixit_shop_app/platform_user_location/user_location_stub.dart' // Version which just throws UnsupportedError
if (dart.library.io) "package:fixit_shop_flutter/fixit_shop_app/platform_user_location/user_location_device.dart"
if (dart.library.js) "package:fixit_shop_flutter/fixit_shop_app/platform_user_location/user_location_web.dart";
abstract class UserLocation {
// methods to be used
Future<Map<String, dynamic>> getPosition() async {
Future<Map<String, dynamic>> position;
return position;
}
factory UserLocation() => getUserLocation();
}
[在我的应用程序中,我正在使用sembast db,并且我尝试使AppDatabase单例类适应于平台,并在应用程序在网络上运行时使用sambast_web。我正在尝试使用相同的模式...
发现错误。确实,这是有条件的进口。我正在导入各种各样的sembast软件包,而不是设备和Web类的实现。.