Flutter/Firebase:Firebase 本地模拟器无法在 Android 模拟器中运行

Flutter/Firebase: Firebase local emulator not working in Android emulator

我正在尝试开发一个使用 Firebase 作为后端的项目。我在 iOS Simulator 中使用了 Firebase Emulator,它运行良好。我已将 Android 模拟器特定设置添加到我的项目中:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  String host = !kIsWeb && Platform.isAndroid ? '10.0.2.2' : 'localhost';
  await Firebase.initializeApp();
  await FirebaseAuth.instance.useAuthEmulator(host, 9099);
  FirebaseFirestore.instance.settings = Settings(
    host: '$host:8080',
    sslEnabled: false,
    persistenceEnabled: false,
  );

  runApp(const MyApp());
}

我在验证时收到以下错误。

E/flutter ( 7777): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: [firebase_auth/unknown] null
E/flutter ( 7777): #0      MethodChannelFirebaseAuth.createUserWithEmailAndPassword
E/flutter ( 7777): <asynchronous suspension>
E/flutter ( 7777): #1      FirebaseAuth.createUserWithEmailAndPassword
E/flutter ( 7777): <asynchronous suspension>
E/flutter ( 7777): #2      _LoginScreenState.build._submitLogin
E/flutter ( 7777): <asynchronous suspension>
E/flutter ( 7777):

授权码:

void _submitLogin(String email, String password) async {
      final _auth = FirebaseAuth.instance;
      UserCredential user;
      final firestore = FirebaseFirestore.instance;

      if (_isSignup && _daysOfWeek.values.every((element) => !element)) {
        await showCupertinoDialog(
          context: context,
          builder: (ctx) {
            return CupertinoAlertDialog(
              title: const Text('No Days Selected'),
              content:
                  const Text('Please select days you are available to play'),
              actions: [
                CupertinoDialogAction(
                  onPressed: () {
                    return;
                  },
                  child: const Text('OK'),
                ),
              ],
            );
          },
        );
      }

      if (_isSignup) {
        user = await _auth.createUserWithEmailAndPassword(
            email: email, password: password);

        firestore.collection('users').doc(user.user.uid).set(
          {
            'date_of_birth': _dateOfBirth,
            'name': _name,
            'hip_size': _hipSize,
            'height': _height,
            'tennis_level': _tennisLevel,
            'days_avaialable': _daysOfWeek,
          },
        );
        return;
      }

      await _auth.signInWithEmailAndPassword(email: email, password: password);
    }

我已经为 android 模拟器创建了主机字符串,但它仍然不起作用。我做错了什么?

编辑:

10.0.2.2 IP space 可通过模拟器访问 chrome:

这是一个奇怪的问题。这与我如何 layed-out 我的小部件树有关。该应用程序正在使用 CupertinoApp 模型。问题本身非常复杂和具体。

问题

表单 child 有这棵树:Expanded -> ListView -> List<CupertinoFormSection> -> List<Widgets>

有些字段不是文本输入,而是使用模式对话框。由于 ListView 的古怪特性,当您关闭模式对话框时,任何不在屏幕上的字段都将清除其值。这通常是电子邮件和密码字段。因此,当保存表单时,onSaved 回调对于电子邮件和密码字段无法正常工作。这就是错误的原因。

解决方案

解决方法很简单;用 Column 替换 ListView 并将其包装在 SingleChildScrollView 中。所以表格 child 树将是...

Expanded -> SingleChildScrollView -> Column -> ...

现在字段没有被清除,也没有 'null' 错误。我在保存之前验证了表单,但我不知道为什么验证器没有被触发。但是错误已经解决了。