Android 模拟器中的 Firebase 存储模拟器连接被拒绝错误

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

我正在尝试将 Firebase Emulator Suite 用于我的 Flutter 应用程序。虽然 Firestore、身份验证和功能模拟器正常工作,但我在存储模拟器方面遇到了问题。

下面是我正在使用的代码。我尝试使用

10.0.2.2
而不是
127.0.0.1
,但同样的错误仍然存在。

void main() async {
  Bloc.observer = AppBlocObserver();

  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  if (USE_EMULATOR) {
    await _connectToFirebaseEmulator();
  }

  runZonedGuarded(() {
    runApp(ElectronicCupongs(appTitle: 'LunchBrejk'));
  }, (error, stacktrace) {
    FirebaseCrashlytics.instance.recordError(error, stacktrace);
  });
}

/// Connect to Firebase emulator
Future _connectToFirebaseEmulator() async {
  final localHost = Platform.isAndroid ? '10.0.2.2' : 'localhost';

  FirebaseFirestore.instance.useFirestoreEmulator(localHost, 8080);
  FirebaseStorage.instance.useStorageEmulator(localHost, 9199);
  FirebaseFunctions.instance.useFunctionsEmulator(localHost, 5001);
  await FirebaseAuth.instance.useAuthEmulator(localHost, 9099);
}

Flutter 启动时,我在调试控制台中看到以下内容:

I/flutter ( 7233): Mapping Firestore Emulator host "127.0.0.1" to "10.0.2.2".
I/flutter ( 7233): Mapping Storage Emulator host "127.0.0.1" to "10.0.2.2".
I/flutter ( 7233): Mapping Functions Emulator host "127.0.0.1" to "10.0.2.2".
I/flutter ( 7233): Mapping Auth Emulator host "127.0.0.1" to "10.0.2.2".

但是,当我尝试从存储加载图像时,出现以下错误:

I/flutter ( 7233): CacheManager: Failed to download file from http://localhost:9199/v0/b/default-bucket/o/restaurants%2FR81.jpg?alt=media&token=4983e466-53d1-4f4e-a1d4-09cce1b27ba1 with error:
I/flutter ( 7233): SocketException: OS Error: Connection refused, errno = 111, address = localhost, port = 39308

有趣的是,我可以使用错误消息中提供的 URL 通过浏览器访问图像。

为了确保这不是规则问题,我修改了我的

storage.rules
文件以允许读写访问。

我正在使用

cached_network_image
包。难道是
cached_network_image
无法正确处理模拟器URL?

问题: 在 Flutter 应用中使用 Firebase 存储模拟器时,如何解决“连接被拒绝”错误?关于可能导致此问题的原因有什么建议或见解吗?

谢谢您的帮助!

android flutter android-emulator localhost firebase-storage
1个回答
0
投票

Android 模拟器使用端口

10.0.2.2
作为本地主机:

您的开发机器上的地址127.0.0.1对应的是 模拟器的环回接口。访问您的计算机上运行的服务 开发机环回接口,使用特殊地址 改为 10.0.2.2。[1]

因此,一个简单的解决方法是在加载图像之前将 localhost

127.0.0.1
替换为
10.0.2.2

final String imageUrl = "http://127.0.0.1:9199/...";

if (UniversalPlatform.isAndroid && kDebugMode)
  imageUrl = imageUrl.replaceAll("127.0.0.1", "10.0.2.2");

return CachedNetworkImage(imageUrl: imageUrl);
//or
return Image.network(imageUrl);

[1] https://developer.android.com/studio/run/emulator-networking#networkaddresses

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