Flutter encapsulado en una única solicitud y un ejemplo de biblioteca de red

https://zhuanlan.zhihu.com/p/53498914


Flutter encapsulado en una única solicitud y un ejemplo de biblioteca de red

 

 

Flutter encapsulado en una única solicitud y un ejemplo de biblioteca de red

 

¿Por qué? ¿Por qué necesitamos un solo caso

En Android a menudo utilizamos OkHttp a las solicitudes de red, pero no siempre queremos crear un OkHttpClient; o a algunos recursos de inicialización es muy molesto, el rendimiento del consumo, esperamos crear una vez, usar en todas partes. Esta vez necesitamos un solo caso. Dio como aleteo en OkHttp, que también puede ser encapsulado con un producto único.

¿Cómo? ¿Cómo lograr un producto único con el dardo

Singleton generalmente varias características:

  1. Detrás de constructor de la clase
  2. Se proporciona un método para obtener una instancia de la clase (Java es a menudo un método estático, la DCL o similar en el interior del método estático, devuelve una instancia)
  3. La instancia sólo puede crearse una vez, sólo un recuerdo, para llegar a cualquier llamando función en el método del Ejemplo 2 debe ser el mismo

Echar un vistazo a cómo lograr patrón Singleton cuando "dardo libro de cocina":

/*The singleton example shows how to do this 
(substitute your singleton class name for Immortal).
Use a factory constructor to implement the
 singleton pattern, as shown in the following code:*/
 class Immortal { static final Immortal theOne = new Immortal._internal('Connor MacLeod'); String name; factory Immortal(name) => theOne; // private, named constructor  Immortal._internal(this.name); } main() { var im1 = new Immortal('Juan Ramirez'); var im2 = new Immortal('The Kurgan'); print(im1.name); print(im2.name); print(Immortal.theOne.name); assert(identical(im1, im2)); }

Se puede ver que _internal () oculta el método de construcción por el constructor llamado privado, proporciona un método de fábrica para obtener una instancia de la clase, y con la modificación static final de la Theone, Theone se inicializará en tiempo de compilación para asegurar que la característica 3. En cuanto a por qué Theone inicializado en tiempo de compilación, la referencia  Variable estática la inicialización de la abrió a la de cualquier expresión El .

Singleton En Acción! Singleton en el proyecto

Dio es proporcionada por una biblioteca pedir flutterchina la red, se puede decir aleteo en OkHttp, interceptores, caché y otras características. Detallada Referencia Dio GitHub . Yo uso un producto único en la librería del proyecto con una capa de paquete simple Dio:

import "package:dio/dio.dart"; import 'dart:async';  class HttpUtil {  static final HttpUtil _instance = HttpUtil._internal();  Dio _client;   factory HttpUtil() => _instance;   HttpUtil._internal() {  if (null == _client) {  Options options = new Options();  options.baseUrl = "http://www.wanandroid.com";  options.receiveTimeout = 1000 * 10; //10秒  options.connectTimeout = 5000; //5秒  _client = new Dio(options); } } Future<Map<String, dynamic>> get(String path, [Map<String, dynamic> params]) async { Response<Map<String, dynamic>> response; if (null != params) { response = await _client.get(path, data: params); } else { response = await _client.get(path); } return response.data; } //...省略post等方法... }

Una cosa más

interfaz de gestión de aplicaciones devuelve el formato de datos en general, tienen una estructura fija, a wanandroid.com ejemplo API de desarrollo:

{
  "data": {
    "curPage": 1, "datas": [], "offset": 0, "over": true, "pageCount": 0, "size": 20, "total": 0 }, "errorCode": 0, "errorMsg": "" }

Para resolver este JSON, Android puede jugar un vistazo a las flores. Pero la reflexión desactivar el aleteo, no hay tal una biblioteca similar a Java en Gson. Internet ofrece un aleteo de varias maneras JSON generado automáticamente de acuerdo con el modelo, como sigue:

Dado que los datos en el proyecto, estructura fija, la forma en que utiliza las herramientas en línea de paradigma + para lograr resolver mi proyecto JSON, este enfoque puede parecer difícil (algunos estudiantes pueden desear proporcionar una forma más elegante de dejar a aprender a) :

1. Definir una clase abstracta, actos convencionales datas modelo de campo de:

abstract class JsonData{
  JsonData fromJson(Map<String, dynamic> json,JsonData mySelf); }

2. Los campos de datos modelo abstracto correspondientes:

import 'package:flutter_app/bean/JsonData.dart'; import 'package:meta/meta.dart'; class PageData<T extends JsonData>{ List<T> datas; int curPage; int pageCount; //...省略size,total等字段  PageData.fromJson({@required Map<String, dynamic> json,@required JsonDataCreator beanCreator}) { // TODO: implement fromJson  curPage = json['curPage']; pageCount = json['pageCount']; print(json); if (json['datas'] != null) { datas = new List<T>(); json['datas'].forEach((v) { JsonData item = beanCreator(); item.fromJson(v,item); datas.add(item); }); } } } typedef JsonDataCreator = JsonData Function();

3. El resumen correspondiente a todo el modelo de retorno resultados:

import 'package:flutter_app/bean/PageData.dart'; import 'package:flutter_app/bean/JsonData.dart'; import 'package:meta/meta.dart'; class BaseResult<T extends JsonData>{ int errorCode; String errorMsg; PageData<T> data; BaseResult.fromJson({@required Map<String, dynamic> json,@required JsonDataCreator beanCreator}) { // TODO: implement fromJson  errorCode = json['errorCode']; errorMsg = json['errorMsg']; data = PageData.fromJson(json:json['data'],beanCreator: beanCreator); } } 

4. Cuando se utiliza en el proyecto, para obtener JSON, poner las herramientas en línea modelo generado, copiarlo, para cambiar más que el formato acordado. Para la lista de interfaces wanandroid artículos , por ejemplo, devuelve los siguientes resultados:

{
  "data": {
    "curPage": 2, "datas": [ { "apkLink": "", "author": "鸿洋", "chapterId": 408, "chapterName": "鸿洋", "collect": false, "courseId": 13, "desc": "", "envelopePic": "", ...其他字段 "title": "一篇文本跳动控件,为你打开一扇大门,学会这两点心得,控件你也会写", "type": 0, "userId": -1, "visible": 1, "zan": 0 }, .... ], "errorCode":0, "errorMsg": } } 

Un modelo que corresponde a un paquete de datas más datos:

import 'package:flutter_app/bean/JsonData.dart'; class ProjectBean extends JsonData{ String title; String envelopePic; @override JsonData fromJson(Map<String, dynamic> json, JsonData mySelf) { // TODO: implement fromJson  if(mySelf is ProjectBean){ mySelf.title = json['title']; mySelf.envelopePic = json['envelopePic']; //...省略其他字段  } return mySelf; } } 

Solicitar datos, y análisis:

class ApiService{
  static Future<List<ProjectBean>> getProjectList() async{ String url = "/project/list/1/json"; Map<String,dynamic> response = await HttpUtil().get(url); BaseResult result = BaseResult<ProjectBean>.fromJson(json: response,beanCreator: ()=>ProjectBean()); print(result.data.datas.length); return result.data.datas; } } 

Debido a que el aleteo no puede utilizar la reflexión, no sé de ninguna manera de obtener el tipo real de paradigma, por lo fromJson () necesidad PageData constructor para pasar un cierre para crear un modelo.

Gracias

Gracias estos conocimientos autores acción, me hizo aprender el proceso de datos de referencia están disponibles:

Ayudan a organizar un rápido inicio del alboroto Trucos mp.weixin.qq.comicono 8 artículos, entonces no se puede aprender aleteo de pegarme! mp.weixin.qq.comicono base de tutoriales de vídeo gratuitos aleteo total de 25 episodios completado juejin.im "flutter real" libro electrónico de código abierto - Denver juejin.im

 

 

Supongo que te gusta

Origin www.cnblogs.com/sundaysme/p/12588716.html
Recomendado
Clasificación