dart开发Android服务,关于android:在Flutter应用中使用由swagger生成的Dart代码生成的Web服务...

我正在尝试使用Flutter开发一个移动应用程序,我使用swagger生成了包含所有Web服务的Dart文件代码生成。我想从Web服务中获取所有用户的列表。 在屏幕上,我想为每个用户显示:图像,名字,姓氏和电子邮件。 我已经在main.dart中准备了如下的UI:

import 'package:flutter/material.dart';

import './utility.dart';

void main() => runApp(ListUserApp());

class ListUserApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

title: 'User List 4Motors',

home: ListUserScreen(),

);

}

}

class ListUserScreen extends StatefulWidget {

@override

State createState() {

return ListUserScreenState();

}

}

class ListUserScreenState extends State {

@override

Widget build(BuildContext context) {

return MaterialApp(

theme: ThemeData(

primarySwatch: Colors.indigo,

),

home: Scaffold(

appBar: AppBar(

title: Text('User List 4Motors'),

),

body: _buildListUser(),

),

);

}

Widget _buildListUser() {

Utility test = new Utility();

print(test.getFirstNameUser());

return ListView.builder(

itemBuilder: (context, position) {

return Card(

child: Padding(

padding: const EdgeInsets.all(16.0),

child: Container(

margin: const EdgeInsets.all(10.0),

child: Row(

crossAxisAlignment: CrossAxisAlignment.start,

children: [

Container(

margin: const EdgeInsets.only(right: 15.0),

child: Image(

width: 65, image: AssetImage('assets/person.jpeg')),  // Image of user

),

Column(

crossAxisAlignment: CrossAxisAlignment.start,

children: [

Text(

'firstname & lastname', // first and last name of user

style: TextStyle(

fontSize: 22,

),

),

Container(

margin: const EdgeInsets.all(5.0),

child: Text('email'), // Email of user

),

],

),

],

),

),

),

);

});

}

}

并且,以下由swagger生成的用户模型:

part of swagger.api;

class UsersData {

String id = null;

String firstName = null;

String lastName = null;

String email = null;

String phone = null;

String image = null;

DateTime birthDay = null;

String fireBaseID = null;

String dealerID = null;

String type = null;

String provider = null;

DateTime registrationDate = null;

DateTime lastLogin = null;

bool allowComment = null;

bool isActive = null;

List addresses = [];

UsersData();

@override

String toString() {

return 'UsersData[id=$id, firstName=$firstName, lastName=$lastName, email=$email, phone=$phone, image=$image, birthDay=$birthDay, fireBaseID=$fireBaseID, dealerID=$dealerID, type=$type, provider=$provider, registrationDate=$registrationDate, lastLogin=$lastLogin, allowComment=$allowComment, isActive=$isActive, addresses=$addresses, ]';

}

UsersData.fromJson(Map json) {

if (json == null) return;

id = json['id'];

firstName = json['firstName'];

lastName = json['lastName'];

email = json['email'];

phone = json['phone'];

image = json['image'];

birthDay =

json['birthDay'] == null ? null : DateTime.parse(json['birthDay']);

fireBaseID = json['fireBaseID'];

dealerID = json['dealerID'];

type = json['type'];

provider = json['provider'];

registrationDate = json['registrationDate'] == null

? null

: DateTime.parse(json['registrationDate']);

lastLogin =

json['lastLogin'] == null ? null : DateTime.parse(json['lastLogin']);

allowComment = json['allowComment'];

isActive = json['isActive'];

addresses = UserAddressData.listFromJson(json['addresses']);

}

Map toJson() {

return {

'id': id,

'firstName': firstName,

'lastName': lastName,

'email': email,

'phone': phone,

'image': image,

'birthDay': birthDay == null ? '' : birthDay.toUtc().toIso8601String(),

'fireBaseID': fireBaseID,

'dealerID': dealerID,

'type': type,

'provider': provider,

'registrationDate': registrationDate == null

? ''

: registrationDate.toUtc().toIso8601String(),

'lastLogin': lastLogin == null ? '' : lastLogin.toUtc().toIso8601String(),

'allowComment': allowComment,

'isActive': isActive,

'addresses': addresses

};

}

static List listFromJson(List json) {

return json == null

? new List()

: json.map((value) => new UsersData.fromJson(value)).toList();

}

static Map mapFromJson(

Map> json) {

var map = new Map();

if (json != null && json.length > 0) {

json.forEach((String key, Map value) =>

map[key] = new UsersData.fromJson(value));

}

return map;

}

}

我创建了一个" Utility.dart"类,该类中放置了一种获取内部所有用户的名字的列表的方法,如下所示:

import 'package:flutter_app_ws/dart-client-generated/lib/api.dart';

class Utility {

UsersData user;

Utility();

List getFirstNameUser() {

List firstName = new List();

firstName.add(user.firstName);

return firstName;

}

}

当我运行我的应用程序时,出现很多错误,如下所示:

Compiler message:

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:6:8:

Error: Not found: 'dart:html'

import 'dart:html';

^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:95:25:

Error: Type 'HttpRequest' not found.

void _openHttpRequest(HttpRequest request, String method, String url,

^^^^^^^^^^^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:30:25:

Error: 'HttpRequest' isn't a type.

final _xhrs = new Set();

^^^^^^^^^^^

lib/main.dart:63:27: Error: Expected an identifier, but got ','.

, // first and last name of user

^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:44:19:

Error: Method not found: 'HttpRequest'.

var xhr = new HttpRequest();

^^^^^^^^^^^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:55:45:

Error: Method not found: 'Blob'.

var blob = xhr.response == null ? new Blob([]) : xhr.response;

^^^^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:56:24:

Error: Method not found: 'FileReader'.

var reader = new FileReader();

^^^^^^^^^^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:55:49:

Error: Too many positional arguments: 0 allowed, but 1 found.

Try removing the extra positional arguments.

var blob = xhr.response == null ? new Blob([]) : xhr.response;

^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:95:25:

Error: 'HttpRequest' isn't a type.

void _openHttpRequest(HttpRequest request, String method, String url,

^^^^^^^^^^^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:97:13:

Error: The method 'open' isn't defined for the class 'invalid-type'.

Try correcting the name to the name of an existing method, or defining a method named 'open'.

request.open(method, url, async: asynch, user: user, password: password);

^^^^

file:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:105:11:

Error: The method 'abort' isn't defined for the class 'invalid-type'.

Try correcting the name to the name of an existing method, or defining a method named 'abort'.

xhr.abort();

我想知道问题所在,以及如何使用我的Web服务来获取和显示:所有用户的图像,名字/姓氏和电子邮件。

也许您在pubspec.yaml中缺少某些软件包。 招摇是否在生成过程中生成了pubspec.yaml? 在这种情况下,您可以将所需的包复制并粘贴到主项目pubspec.yaml中。

我可以使用2.4.2版的swagger-codgen生成用于测试flutter项目的swagger客户端,它应该已经解决了该问题。

java -jar swagger-codegen-cli-2.4.2.jar generate -l dart -i openapi.json -o swagger -DbrowserClient=false

重要标志:-DbrowserClient=false

然后按照README.md指令将生成的swagger库添加到我的测试flutter项目中:

Local

To use the package in your local drive, please include the following in >pubspec.yaml

dependencies:

swagger:

path: /path/to/swagger

Tests

TODO

Getting Started

Please follow the installation procedure and then run the following:

import 'package:swagger/api.dart';

// TODO Configure API key authorization: api_key

//swagger.api.Configuration.apiKey{'key'} = 'YOUR_API_KEY';

// uncomment below to setup prefix (e.g. Bearer) for API key, if needed

//swagger.api.Configuration.apiKeyPrefix{'key'} ="Bearer";

var api_instance = new DefaultApi();

我只需要在swagger库的pubspec.yaml中也明确指定环境。

name: swagger

version: 1.0.0

description: Swagger API client

environment:

sdk:">=2.1.0 <3.0.0"

dependencies:

http: '>=0.11.1 <0.12.0'

更新

我也尝试过openapi-generator-cli

java -jar openapi-generator-cli-3.3.4.jar generate -l dart -i openapi.json -o openapi -DbrowserClient=false

和Followwing README.md的方式与您大张旗鼓一样。

我尝试了,两种解决方案都可以。 开放的API似乎比摇摇欲坠的客户端更扑朔迷离,因为我不需要在生成的开放api库的pubspec.yaml中添加环境,但是它是自动设置的。

是的,swagger还会生成一个pubspec.yaml,其中包含以下几行"名称:swagger版本:1.0.0说明:Swagger API客户端依赖项:http:> = 0.11.1 <0.12.0",我添加了缺少的依赖项"达特森:" ^ 0.2.4" dev_dependencies:吉尼斯:^ 0.1.17浏览器:任何转换器:-达特森",但错误仍然存??在

我迷路了,有人可以帮我吗

@MimiSoftware发现了此问题。因此,我将尝试使用最新的代码生成,然后让您知道。

当我输入以下命令时:" java -jar swagger-codegen-cli-2.4.2.jar generate -l dart -i openapi.json -o swagger -DbrowserClient = false",以下内容显示为"无法访问jarfile swagger-codegen- cli-2.4.2.jar"

@MimiSoftware您需要从这里下载它...

完成,但出现另一个错误"线程"主"中的异常java.lang.UnsupportedClassVersionError:io / swagger / codegen / SwaggerCodegen:不支持的major.minor版本51.0"

@MimiSoftware github.com/swagger-api/swagger-codegen/issues/605,github.com/swagger-api/swagger-codegen/issues/917我的Java版本是java version"1.8.0_191"

@MimiSoftware Ive已考虑开放API生成器更新了我的答案。顺便说一句,这两种解决方案都对我有效。

我将Java版本升级到" 1.8.0_171",然后通过此命令" wget central.maven.org/maven2/org/openapitools/openapi-generator-cli/-下载了openapi-generator-cli-3.3.4.jar- O openapi-generator-cli.jar",之后我运行此命令" java -jar openapi-generator-cli.jar generate -l dart -i openapi.json -o openapi -DbrowserClient = false",出现如下错误" [错误]找不到规范文件:openapi.json [错误]检查OpenAPI规范的路径,然后重试。

您是如何生成您的swagger库的第一个版本的?我猜您没有使用摇摇欲坠的代码生成的jar版本。我曾经使用过一个,而我在这里也曾经使用过。如果您对这种类型的生成不满意,则仍然可以使用实际方法,但请记住不要使用此标志-DbrowserClient=false生成客户端浏览器。 openapi.json是您应该拥有的文件,通常是后端开发人员提供的文件,并且是(通过开放api规范)描述WebService的文件,并且是生成客户端所需的文件。

@MimiSoftware由于您已经拥有客户端库的代码,因此仅生成一次,那么如何生成它呢?粗俗的原因,您没有使用我在这里建议您的方法...

@MimiSoftware因此,选择了您希望生成代码的方法,但是使用此标志-DbrowserClient=false.以便不生成ClientBrowser,该组件使您的代码无法编译。

我只是去" swagger.io",然后用帐户登录以摇晃集线器,然后选择" import Api",然后输入我的Web服务的网址。之后,我将此文件导出为" dart-client-generation" dart文件。最后,我将此文件导入flutter项目中,并在pubspec.yaml中添加了缺少的依赖项,这是我遵循的过程。你明白我了吗 ?

@MimiSoftware是的,我了解您,但我从未使用过"导入API"功能,因为我没有SwaggerHub帐户。但是,如果您的Web服务与OpenApi兼容,则可以使用yaml或json格式获得Web服务规范。通常是通过附加诸如example.comswagger之类的快捷路径来提供的Web服务URL,但这取决于您的配置。因此,您可以检查如何在SwaggerHub(我不知道这部分)中传递一个生成标记,或者获取您的Web服务规范并使用我的方法。

这是我工作中必需的方法。 到目前为止,我对如何使用Web服务一无所知。 无论如何,谢谢您的所有答复,如果您遇到有关我的问题的一些事情,请告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Altium Designer20原理图绘制

1.网络标签 如图所示&#xff0c;添加网络标签&#xff0c;两个相同标签连到一块 添加name&#xff0c;可以直接按TAB键改名&#xff0c;如果需要上横线&#xff0c;在字母后面加’\‘ 2.电源标识 3.画线 这里的线不是导线&#xff0c;不具有电气特性&#xff0c;是用来划…

Altium Designer20原理图库放置引脚报错解决方案

原理图库里点击放置引脚&#xff0c;然后AD20报错。 View Pin threw an exception. System.Windows.Markup.XamlParseException: 在“System.Windows.Markup.StaticResourceHolder”上提供值时引发了异常。 —> System.Exception: 无法找到名为“JustificationToAlignmen…

android微信表情导出来的,微信表情怎么导出 如何批量备份微信表情

微信表情怎么导出&#xff1f;如何批量备份微信表情&#xff1f;因为微信自身的软件限制因素&#xff0c;导致我们无法直接在手机客户端中完成自定义表情的导入操作&#xff0c;所以还请各位小伙伴们移步PC端同步助手来导入自定义表情哦~1)下载安装同步助手电脑版&#xff0c;将…

输出指定范围内的完数

题目要求 本题要求实现一个计算整数因子和的简单函数&#xff0c;并利用其实现另一个函数&#xff0c;输出两正整数m和n&#xff08;0<m≤n≤10000&#xff09;之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如&#xff1a;6123&#xff0c;其中1、2、3为…

android 视频录制和上传,关于android实时视频录制与上传 .

关于android的实时视频录制现在网上炒的很火&#xff0c;我想把自己学习研究的一个视频录制的demo 的心得与大家分享一下使用的是MediaRecorder 以及使用SurfaceView进行录制的。视频录制的部分也比较简单&#xff0c;直接看API的图就可以很清楚的知道步骤了。Android的MediaRe…

输出指定范围内的Fibonacci数

题目要求 本题要求实现一个计算Fibonacci数的简单函数&#xff0c;并利用其实现另一个函数&#xff0c;输出两正整数m和n&#xff08;0<m≤n≤10000&#xff09;之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和&#xff08;最开始两项均定义为1&a…

html5中正则表达式怎么加,HTML5中的字母正则表达式(Alphabetic Regex in HTML5)

HTML5中的字母正则表达式(Alphabetic Regex in HTML5)我是regex的新手&#xff0c;但我需要找到一种方法来为HTML5表单添加一个过滤器&#xff1a;例如&#xff0c;任何人都可以帮我设置模式属性中的内容公认&#xff1a;JohnFrank不接受&#xff1a;Ke$haB0B(只接受字母字符。…

Android studio下载安装使用遇到的问题及解决办法

1.haxm文件已经下载&#xff0c;但未安装&#xff0c;导致启动avd模拟器不成功 ①&#xff1a;在Android Studio中打开 File | Settings | Appearance & Behavior | System Settings | Android SDK&#xff0c;下载HAXM ②&#xff1a;打开文件资源管理器&#xff0c;进…

html盒子自动居中,css盒子怎么居中?

在前端切图的时候&#xff0c;可能经常会遇到一个div盒子怎么在固定区域垂直居中的需求&#xff0c;下面我们来看一下css实现盒子居中的方法。css设置盒子居中的方法&#xff1a;第一种&#xff1a;用css的position属性.div1 {width: 100px;height: 100px;border: 1px solid #0…

Altium Designer20原理图库制作

1.绘制SMA元件 放置管脚&#xff0c;管脚的十字朝外&#xff0c;点击place pin 然后按TAB键。Designator是管脚号&#xff0c;Name可以不写。点击眼睛的按钮可以隐藏管脚号。 可以双击引脚修改长度 可以通过修改圆的宽度&#xff0c;变成实心的。 设置元器件的名字&#xff…

如何抓取html请求,怎么获取请求头

如何查看HTTP请CSS布局HTML小编今天和大家分享头方法/步骤 1 打开Chrome浏览器&#xff0c;点击右上角“三”按钮。 点击工具-再点击开发者工具 2 找到Network选项框。以百度经验页面为例&#xff0c;点击任务选框来查看网络请CSS布局HTML小编今天和大家分享流 3 在Network框内…

HTML5类选择器使用,CSS选择器种类及使用方法

CSS选择器种类及使用方法2018年04月17日| 萬仟网IT编程| 我要评论css选择器 有通配符选择器书写格式&#xff1a;*&#xff5b;声名块&#xff5d; 并集选择器/组合选择器 书写格式;元素或类或id“”元素或类或id“&#xff0c;”元素或类或id&#xff5b;声明块&#xff5d; 列…

输出一个整数的逆序数

题目要求 本题要求实现一个求整数的逆序数的简单函数。 函数接口定义&#xff1a; int reverse( int number ); 其中函数reverse须返回用户传入的整型number的逆序数。 代码&#xff1a; 处理一个数的每一位。 #include <stdio.h>int reverse( int number ); int r…

yii2 html 跳转,阐述在Yii2上实现跳转提示页

序言为了让用户有更加良好的体验&#xff0c;在操作成功或者失败后&#xff0c;来个提示并跳转页面&#xff0c;我就在Yii2上实现了这一个效果。在写这个跳转提示页的时候&#xff0c;找资料我发现网上关于这方面的中文资料真的很少&#xff0c;大家也都共享下吧&#xff01;需…

两数的和与差的简单函数

题目要求 本题要求实现一个计算输入的两数的和与差的简单函数。 函数接口定义&#xff1a; void sum_diff( float op1, float op2, float *psum, float *pdiff ); 其中op1和op2是输入的两个实数&#xff0c;psum和pdiff是计算得出的和与差。 代码 函数通过指针赋值。 #inc…

数组循环右移

题目要求 本题要求实现一个对数组进行循环右移的简单函数&#xff1a;一个数组a中存有n&#xff08;>0&#xff09;个整数&#xff0c;将每个整数循环向右移m&#xff08;≥0&#xff09;个位置&#xff0c;即将a中的数据最后m个数循环移至最前面的m个位置。 函数接口定义…

c# url传参不能包含html标签,c#解析包含HTML特殊字符的字符串XElement

在客户端的服务器 GWT上使用.NET c&#xff03;&#xff0c;我有一个Web窗体&#xff0c;它接受用户输入&#xff0c;然后构建一个XML字符串并将其存储在数据库中。然后我需要从数据库中读取它&#xff0c;通过tcp将它发送到手持设备&#xff0c;并将其解析为XElement。一切运作…

Altium Designer20 PCB封装库制作

出现如下界面 如果说找不到这个十字&#xff0c;可以按如下方法重新找到 SMA-KE封装 设置里面可以调整焊盘和孔的大小形状。 如果说想要切换默认单位&#xff0c;以mm为单位 不选中焊盘&#xff0c;然后点击properties。 量出距离 然后发现有小数&#xff0c;由于每一格移…

html字符串变量,字符串变量中的Python HTML

我使用python中的FPDF通过一个函数生成PDF格式的发票。我使用一个字符串变量在HTML中构建一个表&#xff0c;并通过一个列表循环&#xff0c;该列表具有填充表标记行的条形码。在我遇到的问题是&#xff0c;当我尝试生成PDF时&#xff0c;总是得到这个TypeError TypeError: str…

Altium Designer20 PCB板子绘制

版层 top layer 顶层 bottom layer 底层 设置板子大小 布局 过孔 top layer层连到bottom layer层。通过via连接。 设置线宽 在design rules里可以设置线宽。 右键new rule 可以新增线宽&#xff0c;电源设置成20mil 还可以设置很多其他的线宽 修改安全距离 安全…