在Flutter应用中使用由swagger生成的Dart codegn提供的WebServices

时间:2019-03-08 08:00:01

标签: android dart flutter swagger

我正在尝试使用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<StatefulWidget> createState() {
            return ListUserScreenState();
          }
        }

        class ListUserScreenState extends State<ListUserScreen> {
          @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: <Widget>[
                            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: <Widget>[
                                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<UserAddressData> 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<String, dynamic> 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<String, dynamic> 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<UsersData> listFromJson(List<dynamic> json) {
    return json == null
        ? new List<UsersData>()
        : json.map((value) => new UsersData.fromJson(value)).toList();
  }

  static Map<String, UsersData> mapFromJson(
      Map<String, Map<String, dynamic>> json) {
    var map = new Map<String, UsersData>();
    if (json != null && json.length > 0) {
      json.forEach((String key, Map<String, dynamic> 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<String> getFirstNameUser() {
    List<String> firstName = new List<String>();
    firstName.add(user.firstName);
    return firstName;
  }

}

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

  

编译器消息:       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:6:8:   错误:找不到:'dart:html'       导入'dart:html';              ^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:95:25:   错误:找不到类型“ HttpRequest”。         void _openHttpRequest(HttpRequest请求,String方法,String url,                               ^^^^^^^^^^^^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:30:25:   错误:“ HttpRequest”不是类型。         final _xhrs = new Set();                               ^^^^^^^^^^^^       lib / main.dart:63:27:错误:期望使用标识符,但得到了','。                                 ,//用户的名字和姓氏                                 ^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:44:19:   错误:找不到方法:“ HttpRequest”。           var xhr = new HttpRequest();                         ^^^^^^^^^^^^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:55:45:   错误:找不到方法:“斑点”。             var blob = xhr.response == null? new Blob([]):xhr.response;                                                   ^^^^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:56:24:   错误:找不到方法:“ FileReader”。             var reader = new FileReader();                              ^^^^^^^^^^^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:55:49:   错误:位置参数过多:允许0,但找到1。       尝试删除多余的位置参数。             var blob = xhr.response == null? new Blob([]):xhr.response;                                                       ^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:95:25:   错误:“ HttpRequest”不是类型。         void _openHttpRequest(HttpRequest请求,String方法,String url,                               ^^^^^^^^^^^^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:97:13:   错误:未为类“无效类型”定义方法“打开”。       尝试将名称更正为现有方法的名称,或定义一个名为“ open”的方法。           request.open(方法,URL,异步:异步,用户:用户,密码:密码);                   ^^^^       文件:///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:105:11:   错误:未为类“无效类型”定义方法“中止”。       尝试将名称更正为现有方法的名称,或定义一个名为“ abort”的方法。             xhr.abort();

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

1 个答案:

答案 0 :(得分:0)

我能够为版本 swagger-codgen 的 2.4.2 版的测试颤动项目生成swagger客户端,该版本应该已经解决了issue。 / p>

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项目中:

  

本地

     

要在本地驱动器中使用该软件包,请在> pubspec.yaml

中包括以下内容
dependencies:
 swagger:
   path: /path/to/swagger
     

测试

     

待办事项

     

入门

     

请按照安装过程操作,然后运行以下命令:

     
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

和跟随机翼README.md,就像用招摇一样。

我尝试了,两种解决方案都起作用。与挥舞的客户端相比,开放API似乎更能应付自如,因为我不需要在生成的开放api库的pubspec.yaml中添加环境,但是它是自动设置的。