Используйте веб-сервисы, предоставляемые Dart Codegn, сгенерированные Swagger в моем приложении Flutter - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь разработать мобильное приложение с Flutter, я использую swagger для генерации кодекса файлов Dart, который содержит все веб-сервисы. Я хочу получить список всех пользователей из веб-сервисов.На экране я хочу отобразить для каждого пользователя: изображение, имя, фамилию и адрес электронной почты.Я подготовил пользовательский интерфейс в main.dart следующим образом:

 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;
  }
}

Я создаю класс «Утилита».дротик ", который я положил метод, чтобы получить список имен всех пользователей внутри, как показано ниже:

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;
  }

}

, когда я запускаю свое приложение, многие ошибки появляются следующим образом:

Сообщение компилятора: file: ///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.dart:6: 8: Ошибка: не найдено: '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: Ошибка: введитеHttpRequest не найден.void _openHttpRequest (запрос HttpRequest, метод 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: ошибка: «HttpRequest» не является типом. Final _xhrs = new Set (); ^^^^^^^^^^^ lib/main.dart:63:27: Ошибка: ожидал идентификатор, но получил ','., // имя и фамилию пользователя ^ file: ///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: Ошибка: метод не найден: «Blob». 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 ();^^^^^^^^^^ file: ///home/innovi/development/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+1/lib/src/browser_client.дротик: 55: 49: ошибка: слишком много позиционных аргументов: 0 разрешено, но 1 найдено.Попробуйте удалить дополнительные позиционные аргументы.var blob = xhr.response == ноль?новый 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: Ошибка: 'HttpRequest 'не тип.void _openHttpRequest (запрос HttpRequest, метод 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: Ошибка: метод 'open' не определен для класса 'invalid-type'. Попробуйте исправить имя с именем существующего методаили определение метода с именем «open». request.open (метод, url, async: asynch, пользователь: пользователь, пароль: пароль); ^^^^ file: ///home/innovi/development/flutter/.pub-cache / hosted / pub.dartlang.org / http-0.12.0 + 1 / lib / src / browser_client.dart: 105: 11: Ошибка: метод 'abort' не определен для класса 'invalid-type'Попробуйте исправить имя с именем существующего метода или определить метод с именем 'abort'. Xhr.abort ();

Я хочу знать, в чем проблема, и как я могу потреблятьМой веб-сервис, чтобы получить и отобразить: изображение, имя / фамилию и адрес электронной почты всего пользователя.

1 Ответ

0 голосов
/ 08 марта 2019

Мне удалось создать swagger-клиент для тестового проекта флаттера с версией 2.4.2 из swagger-codgen , который должен был решить эту проблему .

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

Важный флаг: -DbrowserClient=false

И следуя инструкциям README.md, чтобы добавить сгенерированную библиотеку swagger в мой проект тестового флаттера:

Местное

Чтобы использовать пакет на вашем локальном диске, пожалуйста, включите следующее в> pubspec.yaml

dependencies:
 swagger:
   path: /path/to/swagger

Тесты

TODO

Начало работы

Пожалуйста, следуйте процедуре установки, а затем выполните следующее:

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();

Мне нужно было явно указать среду также в pubspec.yaml в библиотеке swagger.

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'

UPDATE

Я пробовал также 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 кажется более готовым к работе, чем клиент swagger, потому что мне не нужно было добавлять среду в pubspec.yaml сгенерированной библиотеки open api, но она устанавливается автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...