Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 提交表单可以在iOS和web上使用,但不能在Android上使用_Flutter - Fatal编程技术网

Flutter 提交表单可以在iOS和web上使用,但不能在Android上使用

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

非常简单的登录表单,可以在iOS和web上使用,但不能在Android上使用。是否有一些基本的东西,或者是否有一些与此相关的bug。基本上,点击“提交”按钮不会进行登录调用

如果您想知道,AppState是一个Singleton类

基本上,它与颤振文件中定义的形式相同:

导入“包装:颤振/材料.省道”;
导入“包: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'),
            ),
          ),
        ],
      ),
    );
  }
}