有条件的程序包导入会破坏代码Flutter

问题描述 投票:0回答:1

[在我的应用程序中,我正在使用sembast db,并且我试图使AppDatabase单例类适应于平台,并在应用程序在网络上运行时使用sambast_web。我正在尝试使用与用户位置相同的模式,因此创建了:

  1. 具有getter方法的存根。
  2. abstract class AppDatabase可以在导入存根时为设备和Web包提供条件包导入,并且在类工厂方法中返回存根getter方法。
  3. 都实现class AppDatabaseDevice的[A class AppDatabaseWebAppDatabase

运行应用程序面团时出现错误:

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。我正在尝试使用相同的模式...

flutter dart factory
1个回答
0
投票

发现错误。确实,这是有条件的进口。我正在导入各种各样的sembast软件包,而不是设备和Web类的实现。.

© www.soinside.com 2019 - 2024. All rights reserved.