我正在尝试使用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服务一无所知。 无论如何,谢谢您的所有答复,如果您遇到有关我的问题的一些事情,请告诉我。