Flutter 提交表单可以在iOS和web上使用,但不能在Android上使用
非常简单的登录表单,可以在iOS和web上使用,但不能在Android上使用。是否有一些基本的东西,或者是否有一些与此相关的bug。基本上,点击“提交”按钮不会进行登录调用 如果您想知道,AppState是一个Singleton类 基本上,它与颤振文件中定义的形式相同:Flutter 提交表单可以在iOS和web上使用,但不能在Android上使用,flutter,Flutter,非常简单的登录表单,可以在iOS和web上使用,但不能在Android上使用。是否有一些基本的东西,或者是否有一些与此相关的bug。基本上,点击“提交”按钮不会进行登录调用 如果您想知道,AppState是一个Singleton类 基本上,它与颤振文件中定义的形式相同: 导入“包装:颤振/材料.省道”; 导入“包:flatter_poc/app_state.dart”; 将“package:http/http.dart”导入为http; 导入“dart:convert”作为convert; 类A
导入“包装:颤振/材料.省道”;
导入“包:flatter_poc/app_state.dart”;
将“package:http/http.dart”导入为http;
导入“dart:convert”作为convert;
类AuthPage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
子:中心(子:MyCustomForm()),
),
);
}
}
类MyCustomForm扩展了StatefulWidget{
@凌驾
MyCustomFormState createState(){
返回MyCustomFormState();
}
}
类MyCustomFormState扩展了状态{
final _formKey=GlobalKey();
字符串\u用户名;
字符串\u密码;
未来的getAuthToken(用户名、密码)异步{
final postData={'username':用户名,'password':密码};
最终罗吉努尔酒店https://xxx/login';
最终响应=等待http.post(loginUrl,body:postData);
如果(response.statusCode==200){
最终数据=convert.jsonDecode(response.body);
返回数据['token'];
}
返回null;
}
@凌驾
小部件构建(构建上下文){
//使用上面创建的_formKey构建表单小部件。
报税表(
键:_formKey,
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
TextFormField(
装饰:输入装饰(hintText:“电子邮件”),
验证器:(值){
if(value.isEmpty){
返回“输入电子邮件”;
}
返回null;
},
onSaved:(val)=>{u username=val},
),
TextFormField(
装饰:输入装饰(hintText:“密码”),
验证器:(值){
if(value.isEmpty){
返回“输入密码”;
}
返回null;
},
蒙昧文字:对,
onSaved:(val)=>{u password=val},
),
填充物(
填充:常量边集。对称(垂直:16.0),
孩子:升起按钮(
onPressed:()异步{
最终形式=_formKey.currentState;
if(form.validate()){
form.save();
最终令牌=等待getAuthToken(\u用户名,\u密码);
if(标记==null){
Scaffold.of(上下文).showSnackBar(
SnackBar(内容:文本(“登录失败”));
}否则{
AppState().setToken(令牌);
}
}
},
子项:文本('Submit'),
),
),
],
),
);
}
}
我没有直接注意到问题,因为我从未得到任何直接响应,所以总是重新启动。但现在,当我在详细模式下运行时,我喝了一杯咖啡,发现有一个DNS解析错误。基本上,我使用的Android模拟器没有从主机上获取DNS,因此它无法解析api地址。通过手动设置dns解决了我的问题,如下所示:您有任何错误吗?日志将帮助我们确定您为什么会遇到这种情况。但你们可能想仔细检查你们的android清单上的权限,比如互联网权限,或者添加cleartextTrafficPermittedPlease-don-post问题,这些问题基本上是指向外部StackOverflow的链接。如果你需要社区的帮助,你需要在这里发布你的问题,包括描述和代码@Rick没有任何错误,只是沉默…@Joãosaares谢谢你的评论。更新。是否在调试
和发布
版本中失败?您能检查一下您的AndroidManifest.xml
文件上是否设置了Android internet权限吗?
import 'package:flutter/material.dart';
import 'package:flutter_poc/app_state.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' as convert;
class AuthPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Center(child: MyCustomForm()),
),
);
}
}
class MyCustomForm extends StatefulWidget {
@override
MyCustomFormState createState() {
return MyCustomFormState();
}
}
class MyCustomFormState extends State<MyCustomForm> {
final _formKey = GlobalKey<FormState>();
String _username;
String _password;
Future<String> getAuthToken(username, password) async {
final postData = {'username': username, 'password': password};
final loginUrl = 'https://xxx/login';
final response = await http.post(loginUrl, body: postData);
if (response.statusCode == 200) {
final data = convert.jsonDecode(response.body);
return data['token'];
}
return null;
}
@override
Widget build(BuildContext context) {
// Build a Form widget using the _formKey created above.
return Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
decoration: InputDecoration(hintText: 'Email'),
validator: (value) {
if (value.isEmpty) {
return 'Enter email';
}
return null;
},
onSaved: (val) => {_username = val},
),
TextFormField(
decoration: InputDecoration(hintText: 'Password'),
validator: (value) {
if (value.isEmpty) {
return 'Enter password';
}
return null;
},
obscureText: true,
onSaved: (val) => {_password = val},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: RaisedButton(
onPressed: () async {
final form = _formKey.currentState;
if (form.validate()) {
form.save();
final token = await getAuthToken(_username, _password);
if (token == null) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text('failed to login')));
} else {
AppState().setToken(token);
}
}
},
child: Text('Submit'),
),
),
],
),
);
}
}