Flutter encapsulado em uma única solicitação e um exemplo de biblioteca de rede

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


Flutter encapsulado em uma única solicitação e um exemplo de biblioteca de rede

 

 

Flutter encapsulado em uma única solicitação e um exemplo de biblioteca de rede

 

Por quê? Por que precisamos de um único caso

Em Android muitas vezes usamos OkHttp para solicitações de rede, mas nós nem sempre queremos criar um OkHttpClient; ou vai alguns recursos de inicialização é muito problemático, o desempenho do consumo, esperamos criar uma vez, use em todos os lugares. Desta vez precisamos de um único caso. Dio como vibração no OkHttp, podemos também ser encapsulado com um singleton.

Como? Como conseguir um singleton com dardo

Singleton geralmente várias características:

  1. Atrás construtor da classe
  2. Ele fornece um método para obter uma instância da classe (Java é muitas vezes um modo estático, o DCL ou semelhante dentro do método estático, devolve uma instância)
  3. A instância só pode ser criado uma vez, apenas uma memória, para chegar a qualquer lugar de recurso de chamada no método do Exemplo 2 deve ser o mesmo

Dê uma olhada em como alcançar Singleton padrão quando "Dart Cookbook":

/*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)); }

Você pode ver que ele _INTERNAL () esconde o método de construção pelo construtor privado chamado, fornece um método de fábrica para obter uma instância da classe, e com modificação static final do TheOne, TheOne será inicializado em tempo de compilação para garantir que o recurso 3. Quanto à razão TheOne inicializado no momento de compilação, referência  variável estático a inicialização do aberto até a qualquer expressão A .

Singleton em Ação! Singleton no projeto

Dio é fornecido por uma biblioteca pedido flutterchina rede, pode-se dizer Flutter em OkHttp, interceptores, cache e outros recursos. DETALHADA Referência Dio GitHub . Eu uso um singleton na biblioteca do projeto com uma camada de pacote simples 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等方法... }

Mais uma coisa

interface de aplicação de back-end retorna o formato de dados têm, geralmente, uma estrutura fixa, a wanandroid.com exemplo desenvolvimento Api:

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

Para resolver este json, Android pode jogar fora as flores. Mas vibração reflexão desativar, não existe uma semelhante biblioteca para Java em Gson. Internet fornece uma vibração de várias maneiras JSON gerados automaticamente de acordo com o modelo, como segue:

Como os dados do projeto, estrutura fixa, a maneira que eu usei paradigma + ferramentas on-line para conseguir resolver o meu projeto json, essa abordagem pode parecer estranho (alguns estudantes podem querer fornecer uma maneira mais elegante de deixar-me a aprender a) :

1. Definir uma classe abstrata, atos convencionais Dados modelo de campo de:

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

2. Os campos de dados modelo abstrato correspondentes:

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. O resumo correspondente a todo o modelo de resultados de retorno:

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. Quando utilizado no projeto, para obter JSON, colocar ferramentas on-line modelo gerados, copiá-lo, para mudar mais do que o formato acordado. Para lista wanandroid de interfaces de artigos , por exemplo, retorna os seguintes 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": } } 

Um modelo que corresponde a um pacote de dados de Dados:

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

dados de solicitação e análise:

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

Porque a vibração não pode usar reflexão, eu não sei de nenhuma maneira de obter o tipo real de paradigma, de modo construtor PageData fromJson () necessidade de passar um fecho para criar um modelo.

obrigado

Graças a estes conhecimentos autores ação, deixe-me aprender o processo de dados de referência estão disponíveis:

Ajudá-lo a organizar um início rápido da vibração Cheats mp.weixin.qq.comícone 8 artigos, então você não pode aprender Flutter me bater! mp.weixin.qq.comícone Flutter base de tutoriais em vídeo gratuitos total de 25 episódios concluída juejin.im "Flutter real" eBook código aberto - Denver juejin.im

 

 

Acho que você gosta

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