【问题标题】:Flutter/Firebase: Firebase local emulator not working in Android emulatorFlutter/Firebase:Firebase 本地模拟器在 Android 模拟器中不起作用
【发布时间】:2021-07-16 09:42:13
【问题描述】:

我正在尝试开发一个使用 Firebase 作为后端的项目。我在 iOS 模拟器中使用了 Firebase 模拟器,它运行良好。我已将 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 空间可通过模拟器 chrome 访问:

【问题讨论】:

    标签: firebase flutter android-emulator


    【解决方案1】:

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

    问题

    Form 子节点有这棵树:Expanded -&gt; ListView -&gt; List&lt;CupertinoFormSection&gt; -&gt; List&lt;Widgets&gt;

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

    解决方案

    解决方案很简单;用 Column 替换 ListView 并将其包装在 SingleChildScrollView 中。所以 Form 子树将是...

    Expanded -&gt; SingleChildScrollView -&gt; Column -&gt; ...

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

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2017-01-05
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多