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' 错误。我在保存之前验证了表单,但我不知道为什么验证器没有被触发。但是错误已经解决了。
我正在尝试开发一个使用 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' 错误。我在保存之前验证了表单,但我不知道为什么验证器没有被触发。但是错误已经解决了。