当我更新 Firebase 包时,我遇到了同样的问题。
我创建了一个类来交换FirebaseAnalytics
具有基于环境的模拟版本。然后更换FirebaseAnalytics
与包装类AnalyticsService
.
这太老套了,我讨厌它。
如果谁有更好的方法,请分享。
import 'dart:io';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_core/firebase_core.dart';
// The is class is needed because firebase is horrible and apparently hates developers
// - also calling `FirebaseAnalytics.instance` causes tests to fail
class AnalyticsService {
static get instance => Platform.environment.containsKey('FLUTTER_TEST') ? FakeFirebaseAnalytics() : FirebaseAnalytics.instance;
}
class FakeFirebaseAnalytics implements FirebaseAnalytics {
@override
FirebaseApp app;
@override
FirebaseAnalyticsAndroid get android => null;
@override
Future<void> logAdImpression({String adPlatform, String adSource, String adFormat, String adUnitName, double value, String currency, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logAddPaymentInfo({String coupon, String currency, String paymentType, double value, List<AnalyticsEventItem> items, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logAddShippingInfo({String coupon, String currency, double value, String shippingTier, List<AnalyticsEventItem> items, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logAddToCart({List<AnalyticsEventItem> items, double value, String currency, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logAddToWishlist({List<AnalyticsEventItem> items, double value, String currency, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logAppOpen({AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logBeginCheckout({double value, String currency, List<AnalyticsEventItem> items, String coupon, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logCampaignDetails({String source, String medium, String campaign, String term, String content, String aclid, String cp1, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logEarnVirtualCurrency({String virtualCurrencyName, num value, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logEcommercePurchase(
{String currency,
double value,
String transactionId,
double tax,
double shipping,
String coupon,
String location,
int numberOfNights,
int numberOfRooms,
int numberOfPassengers,
String origin,
String destination,
String startDate,
String endDate,
String travelClass}) async {}
@override
Future<void> logEvent({String name, Map<String, Object> parameters, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logGenerateLead({String currency, double value, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logJoinGroup({String groupId, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logLevelEnd({String levelName, int success, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logLevelStart({String levelName, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logLevelUp({int level, String character, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logLogin({String loginMethod, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logPostScore({int score, int level, String character, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logPresentOffer({String itemId, String itemName, String itemCategory, int quantity, double price, double value, String currency, String itemLocationId}) async {}
@override
Future<void> logPurchase(
{String currency, String coupon, double value, List<AnalyticsEventItem> items, double tax, double shipping, String transactionId, String affiliation, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logPurchaseRefund({String currency, double value, String transactionId}) async {}
@override
Future<void> logRefund({String currency, String coupon, double value, double tax, double shipping, String transactionId, String affiliation, List<AnalyticsEventItem> items}) async {}
@override
Future<void> logRemoveFromCart({String currency, double value, List<AnalyticsEventItem> items, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logScreenView({String screenClass, String screenName, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logSearch(
{String searchTerm,
int numberOfNights,
int numberOfRooms,
int numberOfPassengers,
String origin,
String destination,
String startDate,
String endDate,
String travelClass,
AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logSelectContent({String contentType, String itemId}) async {}
@override
Future<void> logSelectItem({String itemListId, String itemListName, List<AnalyticsEventItem> items, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logSelectPromotion(
{String creativeName, String creativeSlot, List<AnalyticsEventItem> items, String locationId, String promotionId, String promotionName, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logSetCheckoutOption({int checkoutStep, String checkoutOption}) async {}
@override
Future<void> logShare({String contentType, String itemId, String method}) async {}
@override
Future<void> logSignUp({String signUpMethod}) async {}
@override
Future<void> logSpendVirtualCurrency({String itemName, String virtualCurrencyName, num value}) async {}
@override
Future<void> logTutorialBegin() async {}
@override
Future<void> logTutorialComplete() async {}
@override
Future<void> logUnlockAchievement({String id}) async {}
@override
Future<void> logViewCart({String currency, double value, List<AnalyticsEventItem> items, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> logViewItem({String currency, double value, List<AnalyticsEventItem> items}) async {}
@override
Future<void> logViewItemList({List<AnalyticsEventItem> items, String itemListId, String itemListName}) async {}
@override
Future<void> logViewPromotion({String creativeName, String creativeSlot, List<AnalyticsEventItem> items, String locationId, String promotionId, String promotionName}) async {}
@override
Future<void> logViewSearchResults({String searchTerm}) async {}
@override
Future<void> resetAnalyticsData() async {}
@override
Future<void> setAnalyticsCollectionEnabled(bool enabled) async {}
@override
Future<void> setConsent({bool adStorageConsentGranted, bool analyticsStorageConsentGranted}) async {}
@override
Future<void> setCurrentScreen({String screenName, String screenClassOverride = 'Flutter', AnalyticsCallOptions callOptions}) async {}
@override
Future<void> setDefaultEventParameters(Map<String, Object> defaultParameters) async {}
@override
Future<void> setSessionTimeoutDuration(Duration timeout) async {}
@override
Future<void> setUserId({String id, AnalyticsCallOptions callOptions}) async {}
@override
Future<void> setUserProperty({String name, String value, AnalyticsCallOptions callOptions}) async {}
@override
Map get pluginConstants => {};
}
将此 hack 应用于问题中的代码:
class FirebaseLogging {
static void log(String log) {
if (Platform.environment.containsKey('FLUTTER_TEST')) return;
FirebaseCrashlytics.instance.log(log);
}
}