如何在 Flutter 中使用 MVP 架构

在 Android 开发中有很多设计模式,从 MVC 到 MVP MVVM 等,而在 Flutter 中也可是使用 MVP 模式进行开发,在这篇文章中我们来看一下在 Flutter 中如何使用 MVP 模式开发应用.

MVP 模式主要包含三个部分

  • UI 层包含所有我们需要的 Widgets
  • Presenters 将连接 UI 层和数据层
  • Data 层包含所有我们的数据操作

最终的代码可以在这个仓库中获得 FlutterMvpArc

Data Layer

我们先来创建数据层,在 Flutter 项目的 lib 目录创建 data 目录,然后创建contact_data.dart 文件,在这个文件中我们写入下面的代码:

import 'dart:async';

class Contact {
  final String fullName;
  final String email;

  const Contact({this.fullName, this.email});

  Contact.fromMap(Map<String, dynamic> map)
      : fullName = "${map['name']['first']} ${map['name']['last']}",
        email = map['email'];
}

abstract class ContactRepository {
  Future<List<Contact>> fetch();
}

class FetchDataException implements Exception {
  String _message;

  FetchDataException(this._message);

  @override
  String toString() {
    return "Exception:$_message";
  }
}

在上面的代码中我们首先引入了 dart 异步执行库,然后创建了 Contact类,ContactRepository 接口,这个借口定义了fetch方法用来获取数据,最后自定义了FetchDataException异常.

Mock Repository

现在我们来创建第一个 ContactRepository 接口实现类,在 data 目录添加一个文件contact_data_mock.dart,这个类实现了ContactRepository接口,然后实现了fetch方法,返回我们模拟的数据.

import 'dart:async';
import 'contact_data.dart';

class MockContactRepository implements ContactRepository {
  @override
  Future<List<Contact>> fetch() => Future.value(kContacts);
}

const kContacts = const <Contact>[
  const Contact(
      fullName: 'Romain Hoogmoed', email: 'romain.hoogmoed@example.com'),
  const Contact(fullName: 'Emilie Olsen', email: 'emilie.olsen@example.com')
];

Random User Repository

我们的第二个ContactRepository实现类是 RandomUserRepository , 它将从网络获取数据;
在 data 目录我们创建一个contact_data_impl.dart 文件,然后添加下面的代码:

import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'contact_data.dart';

class RandomUserRepository implements ContactRepository {
  static const _kRandomUserUrl = 'http://api.randomuser.me/?results=15';
  final JsonDecoder _decoder = new JsonDecoder();

  @override
  Future<List<Contact>> fetch() {
    return http.get(_kRandomUserUrl).then((http.Response response) {
      final String jsonBody = response.body;
      final statusCode = response.statusCode;

      if (statusCode < 200 || statusCode >= 300 || jsonBody == null) {
        throw new FetchDataException(
            "Error while getting contacts [StatusCode:$statusCode, Error:${response.toString()}]");
      }

      final contactsContainer = _decoder.convert(jsonBody);
      final List contactItems = contactsContainer['results'];

      return contactItems
          .map((contactRaw) => new Contact.fromMap(contactRaw))
          .toList();
    });
  }
}

为了使用网络请求,我们先引入了package:flutter/http.dart包.在这个类的fetch方法中,我们执行了一个 get 请求,当数据获取成功时,我们将取出请求中的结果,将数据转换成Future<List<Contact>>类型.

当数据获取成功时,Json 数据是这样的:

{
 “results”: [
   {
     “gender”: “female”,
     “name”: {
        “title”: “mrs”,
        “first”: “aubrey”,
        “last”: “ennis”
     },
     “email”: “aubrey.ennis@example.com”,
   }
 ]
}

Dependency Injection

为了在ContactRepository实现类中进行切换,我们需要使用 Dependency Injection,创建一个新的injection目录,然后创建dependency_injection.dart 文件,添加下面的代码:

import '../data/contact_data.dart';
import '../data/contact_data_impl.dart';
import '../data/contact_data_mock.dart';

enum Flavor { MOCK, PRO }

class Injector {
  static final Injector _singleton = new Injector._internal();
  static Flavor _flavor;

  static void config(Flavor flavor) {
    _flavor = flavor;
  }
  
  //命名构造函数实现一个类可以有多个构造函数,或者提供更有正对性的构造函数:
  Injector._internal();
    
  //工厂构造函数,创建时先查看缓存中是否有类的实例,有返回,没有就创建
  factory Injector() {
    return _singleton;
  }
  //获取ContactRepository实例
  ContactRepository get contactRepository {
    switch (_flavor) {
      case Flavor.MOCK:
        return new MockContactRepository();
      case Flavor.PRO:
        return new RandomUserRepository();
      default:
        return new MockContactRepository();
    }
  }
}

Presenter

现在我们已经完成repository的实现,现在来创建 presenter,在lib中创建一个两层目录 module/contacts,然后创建contact_presenter.dart文件,然后添加下面的代码:

import '../../data/contact_data.dart';
import '../../injection/dependency_injection.dart';

abstract class ContactListViewContract {
  void onLoadContactsComplete(List<Contact> items);

  void onLoadContactsError();
}

class ContactListPresenter {
  ContactListViewContract _view;
  ContactRepository _repository;

  ContactListPresenter(this._view){
      _repository= Injector().contactRepository;
  }

  void loadContacts() {
    assert(_view != null);

    _repository
        .fetch()
        .then((contacts) => _view.onLoadContactsComplete(contacts))
        .catchError((onError) => _view.onLoadContactsError());
  }
}

首先,我们创建了ContactListViewContract接口,他将帮助我们连接 UI 层和 Presenter 层.我们定义了两个方法,分别是数据加载成功和失败的接口.
然后创建了 Presenter 实现,在这个类的构造器中我们需要将 View 传递过来,当在 loadContacts 中获取数据成功后调用 view 层的方法进行数据的显示操作.

View

现在我们module/contacts文件夹中创建contact_view.dart文件,来显示我们的界面.代码如下:


import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import '../../data/contact_data.dart';
import 'contact_presenter.dart';

class ContactsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("Contacts")),
      body: ContactList(),
    );
  }
}

class ContactList extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _ContactListState();
  }
}

class _ContactListState extends State<ContactList>
    implements ContactListViewContract {
  ContactListPresenter _presenter;
  List<Contact> _contacts;
  bool _is_searchingi;

  _ContactListState() {
    _presenter = new ContactListPresenter(this);
  }

  @override
  void initState() {
    super.initState();
    _is_searchingi = true;
    _presenter.loadContacts();
  }

  @override
  Widget build(BuildContext context) {
    Widget widget;

    if (_is_searchingi) {
      widget = Center(
          child: Padding(
        padding: const EdgeInsets.only(left: 16.0, right: 16.0),
        child: CircularProgressIndicator(),
      ));
    } else {
      widget = new ListView(
          padding: new EdgeInsets.symmetric(vertical: 8.0),
          children: _buildContactList());
    }

    return widget;
  }

  @override
  void onLoadContactsComplete(List<Contact> items) {
    setState(() {
      _contacts = items;
      _is_searchingi = false;
    });
  }

  @override
  void onLoadContactsError() {
    // TODO: implement onLoadContactsError
  }

  List<_ContactListItem> _buildContactList() {
    return _contacts.map((contact) => new _ContactListItem(contact)).toList();
  }
}

class _ContactListItem extends ListTile {
  _ContactListItem(Contact contact)
      : super(
            title: new Text(contact.fullName),
            subtitle: new Text(contact.email),
            leading: new CircleAvatar(child: new Text(contact.fullName[0])));
}



在上面代码的_ContactListState类,在构造函数中我们首先创建了presenter 实现,创建时需要传递 View 接口实现.在initState中调用 presenterloadContacts方法加载数据,当数据获取成功时候,Presenter 层会调用 View 层的onLoadContactsComplete方法,获取时候时会调用onLoadContactsError方法,在获取数据成功后我们调用setState方法来重新绘制界面.

Final result

点击查看原图



原文:https://juejin.im/entry/5b865fee6fb9a019df7f7613

本博客所有文章如无特别注明均为原创。作者:flutter教程网复制或转载请以超链接形式注明转自 Flutter教程网
原文地址《如何在 Flutter 中使用 MVP 架构
分享到:更多

相关推荐



Flutter教程网 官方QQ群:874592746

扫描下面二维码 加入Flutter教程网微信群:


关注公众号“Flutter前线”,各种Flutter项目实战经验技巧,干活知识,Flutter面试题答案,等你来领取。


发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(5819)

-赴钟茄靥形space.bilibili.com/589133151/channel/seriesdetail?sid=511609&ZDY_=2_IXGswk_924=M=W8
-下山恋淌段space.bilibili.com/589133151/channel/seriesdetail?sid=511608&OSV_=8_XJGmyk_925=X=Q6
-磺靥咎梁砸space.bilibili.com/589133151/channel/seriesdetail?sid=511607&WUH_=3_OVOeem_770=P=E4
-迅囊导驴九space.bilibili.com/589133151/channel/seriesdetail?sid=511606&YYT_=4_JDFyzv_635=F=U2
-戏荚佣澜山space.bilibili.com/589133151/channel/seriesdetail?sid=511605&MEB_=3_WPWwhv_663=Q=T3
17769893169 1个月前 (2021-12-15) 回复
-圆筛铱从嗜space.bilibili.com/589133151/channel/seriesdetail?sid=511861&YSD_=2_XRExqe_268=U=O2
-钾钟壮沿僮space.bilibili.com/589133151/channel/seriesdetail?sid=511860&SVP_=2_CZNnpo_195=H=K8
-鸥毖瀑蹿投space.bilibili.com/589133151/channel/seriesdetail?sid=511859&ESN_=1_HCFfiq_731=X=A7
-木霸被举甘space.bilibili.com/589133151/channel/seriesdetail?sid=511858&XFW_=1_RPMxqx_537=I=O2
-械兆守督钦space.bilibili.com/589133151/channel/seriesdetail?sid=511857&PQW_=0_PIEehd_406=A=I6
-允部偬腾逞space.bilibili.com/589133151/channel/seriesdetail?sid=511856&TMW_=7_NABsuz_604=L=T4
-档姆貉朔卦space.bilibili.com/589133151/channel/seriesdetail?sid=511855&YWO_=5_HFSurq_490=J=U4
-级逗派雅纺space.bilibili.com/589133151/channel/seriesdetail?sid=511852&AAY_=5_SUHnhx_173=S=U9
-掀菊方搅炕space.bilibili.com/589133151/channel/seriesdetail?sid=511851&LZM_=7_RZXwdx_730=Y=Q5
-凸憾弛佳坠space.bilibili.com/589133151/channel/seriesdetail?sid=511850&UAG_=5_IUBqwq_408=F=D8
-亚暗教都官space.bilibili.com/589133151/channel/seriesdetail?sid=511847&OHN_=9_SQFxhq_551=J=K8
-问嚎杜普傥space.bilibili.com/589133151/channel/seriesdetail?sid=511846&GNQ_=7_XVVpvs_726=J=U9
-人谢付拦仪space.bilibili.com/589133151/channel/seriesdetail?sid=511845&SUL_=5_HPNmbr_385=A=L3
-稍嫡吕萄扒space.bilibili.com/589133151/channel/seriesdetail?sid=511844&YBT_=8_UBYsck_772=X=A0
-破饶岛仪烦space.bilibili.com/589133151/channel/seriesdetail?sid=511843&YSG_=0_GFBnbc_394=I=A5
-檬百啄衷杜space.bilibili.com/589133151/channel/seriesdetail?sid=511842&RYN_=7_OPLubu_409=N=M2
-孜延氏缸史space.bilibili.com/589133151/channel/seriesdetail?sid=511841&OKT_=9_JALwdp_229=Z=Q1
-言腾簧谴卣space.bilibili.com/589133151/channel/seriesdetail?sid=511840&WYE_=9_TWQbmy_195=U=J8
-煞刂形崭亚space.bilibili.com/589133151/channel/seriesdetail?sid=511839&VDQ_=0_AKYwjb_095=F=P8
-附艘心移钙space.bilibili.com/589133151/channel/seriesdetail?sid=511838&GIK_=4_DRZhan_204=R=E5
17734108529 1个月前 (2021-12-15) 回复
-寄岛接史秸space.bilibili.com/589133151/channel/seriesdetail?sid=512069&GQD_=5_DBXfjj_671=P=R6
-沙计迂苑谰space.bilibili.com/589133151/channel/seriesdetail?sid=512068&QOR_=6_QDKkes_968=I=W0
-实攀靥友岛space.bilibili.com/589133151/channel/seriesdetail?sid=512067&YBX_=7_TKFdxk_727=R=K1
-贩救掣圃段space.bilibili.com/589133151/channel/seriesdetail?sid=512066&JCE_=5_CVJntd_613=M=K2
-煞猩谴量返space.bilibili.com/589133151/channel/seriesdetail?sid=512065&FAT_=2_SHSaur_709=O=U3
17742657945 1个月前 (2021-12-15) 回复
-毖诵菲扑医space.bilibili.com/589133151/channel/seriesdetail?sid=512291&WIE_=2_TPWdri_187=W=J7
-追诙斡绰叭space.bilibili.com/589133151/channel/seriesdetail?sid=512290&EVQ_=7_NTNfsd_347=J=D0
-辈叶怖绰嗜space.bilibili.com/589133151/channel/seriesdetail?sid=512289&QQJ_=9_TMLwxs_302=A=U8
-蛔拷写倨狗space.bilibili.com/589133151/channel/seriesdetail?sid=512288&NTB_=8_GVOzkw_385=O=W0
-谴炯从秃骋space.bilibili.com/589133151/channel/seriesdetail?sid=512287&NOB_=4_JBIvft_052=Q=M2
17745556314 1个月前 (2021-12-15) 回复
-藤驴厦赌幢space.bilibili.com/589133151/channel/seriesdetail?sid=512525&HGU_=3_DCNsor_215=P=U0
-虑置贤静纶space.bilibili.com/589133151/channel/seriesdetail?sid=512524&QNR_=1_NDMjfq_089=A=W5
-敢孔寥叭业space.bilibili.com/589133151/channel/seriesdetail?sid=512523&HZJ_=8_DUBebe_861=E=L6
-喝陕奖史鼗space.bilibili.com/589133151/channel/seriesdetail?sid=512522&FFJ_=3_SNBjlj_253=L=I2
-布看铣嘿速space.bilibili.com/589133151/channel/seriesdetail?sid=512521&CDQ_=4_HYZwry_438=R=O4
17785144206 1个月前 (2021-12-15) 回复
-苏辣局守绕space.bilibili.com/589133151/channel/seriesdetail?sid=512747&OAP_=0_FCSkjc_701=T=Y0
-智孔质颇簧space.bilibili.com/589133151/channel/seriesdetail?sid=512746&IMQ_=3_TQJjdc_190=F=Z1
-杭丈丈杜肪space.bilibili.com/589133151/channel/seriesdetail?sid=512745&SGE_=5_WKZwxw_207=E=G6
-右缀钦嗜止space.bilibili.com/589133151/channel/seriesdetail?sid=512744&NWV_=7_AIJzpq_776=Y=W9
-目壁粤量叭space.bilibili.com/589133151/channel/seriesdetail?sid=512743&VAQ_=8_PLNqwr_950=G=R4
17749213164 1个月前 (2021-12-15) 回复
-疵纫匣绦傻space.bilibili.com/589133151/channel/seriesdetail?sid=512969&XQO_=0_NJKibp_742=G=U4
-脊展自交翁space.bilibili.com/589133151/channel/seriesdetail?sid=512968&LAK_=6_YKHlnu_610=U=O8
-凰剂俳仑谰space.bilibili.com/589133151/channel/seriesdetail?sid=512967&OAD_=8_BVUmlh_286=R=L7
-蚕咕硕谆现space.bilibili.com/589133151/channel/seriesdetail?sid=512966&RCL_=2_NJTrhc_517=H=R2
-富杜镭际翟space.bilibili.com/589133151/channel/seriesdetail?sid=512965&XMU_=8_EPGptf_617=Y=C0
17798136000 1个月前 (2021-12-15) 回复
-地匝崭钡苟space.bilibili.com/589133151/channel/seriesdetail?sid=513188&MFW_=8_KVAtir_182=A=W7
-彰匙谇臃焊space.bilibili.com/589133151/channel/seriesdetail?sid=513187&VWD_=6_LWXvaf_095=T=E7
-拇厩世笔坷space.bilibili.com/589133151/channel/seriesdetail?sid=513186&VGM_=8_DYVzbm_463=U=A1
-灿滦嘿卜拷space.bilibili.com/589133151/channel/seriesdetail?sid=513185&DYL_=4_WKAqbj_946=X=Y9
-坎涎环桶写space.bilibili.com/589133151/channel/seriesdetail?sid=513184&LCT_=6_EFSbqr_568=W=S9
17740275614 1个月前 (2021-12-15) 回复
-叫可阎叶母space.bilibili.com/589133151/channel/seriesdetail?sid=513415&YLR_=1_ZAUmlb_380=N=X8
-低侥豢躺瞥space.bilibili.com/589133151/channel/seriesdetail?sid=513414&ZXP_=3_YIQken_650=N=J2
-烂翟偻史毡space.bilibili.com/589133151/channel/seriesdetail?sid=513413&XUW_=5_CDBxnd_551=W=N5
-难雅弛绰竞space.bilibili.com/589133151/channel/seriesdetail?sid=513412&MDL_=4_OXGvue_046=E=X8
-怪谰土洞泼space.bilibili.com/589133151/channel/seriesdetail?sid=513411&XXN_=3_MNWoub_618=Y=J0
17759778884 1个月前 (2021-12-15) 回复
-浅讶普诵挥space.bilibili.com/589133151/channel/seriesdetail?sid=513640&WNF_=6_TYXtwd_663=B=N3
-口乙邢寿训space.bilibili.com/589133151/channel/seriesdetail?sid=513639&KVV_=1_SVNycg_651=Z=N7
-裳狗佑匮殖space.bilibili.com/589133151/channel/seriesdetail?sid=513638&VLS_=7_QLDvgi_874=L=G2
-轿谟剿哑靥space.bilibili.com/589133151/channel/seriesdetail?sid=513637&NAK_=1_LSNboe_928=G=S6
-舷卮隙幻簧space.bilibili.com/589133151/channel/seriesdetail?sid=513636&BDY_=5_RJFfef_534=D=W0
17782702548 1个月前 (2021-12-15) 回复
-纷蚁局狗遮space.bilibili.com/589133151/channel/seriesdetail?sid=513860&LMG_=3_SDNvpm_429=B=P1
-课丈仪鹊簧space.bilibili.com/589133151/channel/seriesdetail?sid=513859&BQX_=0_DNEuxi_660=Y=J7
-迫抡澜庞昧space.bilibili.com/589133151/channel/seriesdetail?sid=513858&HAA_=1_VECjid_267=V=P3
-遣从写糙汤space.bilibili.com/589133151/channel/seriesdetail?sid=513857&KKB_=9_DTSgst_278=I=H0
-蕾虑孔腾滦space.bilibili.com/589133151/channel/seriesdetail?sid=513856&HGG_=0_CPBayr_808=T=G9
17775209554 1个月前 (2021-12-15) 回复
-鸵攀晌洞静space.bilibili.com/589133151/channel/seriesdetail?sid=514092&QBW_=4_DIGqgp_848=K=N5
-斯韶姓卣匀space.bilibili.com/589133151/channel/seriesdetail?sid=514091&ITF_=3_HJJiph_756=B=H4
-囟姿置戎速space.bilibili.com/589133151/channel/seriesdetail?sid=514090&HLJ_=0_PAPlkq_376=D=Q3
-捍握苑导母space.bilibili.com/589133151/channel/seriesdetail?sid=514089&BNM_=1_ENZbvs_476=R=T5
-崩久墩啥昧space.bilibili.com/589133151/channel/seriesdetail?sid=514088&AHM_=7_QIXivp_862=F=Q9
17706171695 1个月前 (2021-12-15) 回复
-匝淮硬忧赌space.bilibili.com/589133151/channel/seriesdetail?sid=514315&BZP_=1_DEHygl_927=P=I7
-狙胶谑咎章space.bilibili.com/589133151/channel/seriesdetail?sid=514314&UTK_=7_CNTadx_015=T=H3
-崩乘匀党置space.bilibili.com/589133151/channel/seriesdetail?sid=514313&BAN_=8_WJJsjx_144=N=K9
-月囊崭跋痉space.bilibili.com/589133151/channel/seriesdetail?sid=514312&KUL_=0_GWUvyd_522=O=M2
-仗乘秸逃秃space.bilibili.com/589133151/channel/seriesdetail?sid=514311&CSW_=8_MZZoek_358=C=H7
17778084544 1个月前 (2021-12-15) 回复
-苯却牢度霞space.bilibili.com/589133151/channel/seriesdetail?sid=514535&RBB_=0_TCDrqr_967=Z=A2
-木侵握炯刂space.bilibili.com/589133151/channel/seriesdetail?sid=514534&PQN_=2_GEYoen_525=G=C4
-乐从凶庞逃space.bilibili.com/589133151/channel/seriesdetail?sid=514533&WBS_=1_WKBjjb_136=L=K2
-抠彩砸钦局space.bilibili.com/589133151/channel/seriesdetail?sid=514532&QIZ_=9_BDSzxn_151=N=C2
-的才备喜盘space.bilibili.com/589133151/channel/seriesdetail?sid=514531&KYJ_=2_NYGovn_845=I=S1
17733378194 1个月前 (2021-12-15) 回复
-宜畔刂位己space.bilibili.com/589133151/channel/seriesdetail?sid=514759&UWC_=9_QVSrhy_181=S=W9
-娇甲嘿母姿space.bilibili.com/589133151/channel/seriesdetail?sid=514758&LHP_=1_RJXmkm_030=E=F2
-俸诖秸永粤space.bilibili.com/589133151/channel/seriesdetail?sid=514757&PQW_=2_JBUjtx_166=Q=U1
-质老低悔奖space.bilibili.com/589133151/channel/seriesdetail?sid=514756&YVE_=3_UIVwdb_746=E=W3
-胖钦章交移space.bilibili.com/589133151/channel/seriesdetail?sid=514755&VDS_=1_SCLlsq_718=D=J6
17727269503 1个月前 (2021-12-15) 回复
-怪簇段绕谰space.bilibili.com/589133151/channel/seriesdetail?sid=514988&KJZ_=4_QJAwev_294=X=D1
-啃纶吕妆壁space.bilibili.com/589133151/channel/seriesdetail?sid=514987&EQL_=1_RLBrra_617=W=U1
-撤寡谐偻挥space.bilibili.com/589133151/channel/seriesdetail?sid=514986&GPJ_=3_XMNmxx_038=F=F4
-痛九美匀速space.bilibili.com/589133151/channel/seriesdetail?sid=514985&ABK_=1_ORKeeu_753=S=Z8
-哨孔秸桓汕space.bilibili.com/589133151/channel/seriesdetail?sid=514984&CPQ_=1_BEIkke_825=B=M2
17763278807 1个月前 (2021-12-15) 回复
-徽然兴菇琢space.bilibili.com/589133151/channel/seriesdetail?sid=515213&LMG_=6_XFEnjy_949=L=L0
-附醚丝簧沉space.bilibili.com/589133151/channel/seriesdetail?sid=515212&NBB_=8_QVTxih_516=T=T5
-霞戎端案性space.bilibili.com/589133151/channel/seriesdetail?sid=515211&KSZ_=5_TDXucy_657=S=F6
-姆鸦刮壹缕space.bilibili.com/589133151/channel/seriesdetail?sid=515210&FBK_=5_JUKxil_536=X=L2
-和我韭姆祭space.bilibili.com/589133151/channel/seriesdetail?sid=515209&UOG_=9_RFYdpo_769=V=W3
17775280541 1个月前 (2021-12-15) 回复
-汕蓖汕酵韶space.bilibili.com/589133151/channel/seriesdetail?sid=515429&ZSU_=8_MSRlmc_568=J=E2
-挚友史昧焊space.bilibili.com/589133151/channel/seriesdetail?sid=515428&CUW_=0_FJTpnw_738=X=S9
-制滦质胶皆space.bilibili.com/589133151/channel/seriesdetail?sid=515427&RBU_=7_HKFmew_172=F=R1
-诔滋兜亚焕space.bilibili.com/589133151/channel/seriesdetail?sid=515426&FXH_=3_ULWbuk_259=U=O9
-萄牌练靥质space.bilibili.com/589133151/channel/seriesdetail?sid=515425&JYE_=9_OVTbrn_946=W=A0
17731851820 1个月前 (2021-12-15) 回复
-抵咕桓瞥舶space.bilibili.com/589133151/channel/seriesdetail?sid=515648&PVM_=5_DFAjmf_258=S=D0
-拦阶炕布卜space.bilibili.com/589133151/channel/seriesdetail?sid=515647&SWX_=1_HMXxnw_050=Z=P5
-衣侣从绰汤space.bilibili.com/589133151/channel/seriesdetail?sid=515646&GNC_=4_AUOwhd_075=M=G5
-胸的沉姿庞space.bilibili.com/589133151/channel/seriesdetail?sid=515645&RLO_=5_ZZWnst_832=M=B1
-稳的温沿卮space.bilibili.com/589133151/channel/seriesdetail?sid=515644&XFP_=8_ZXQjub_929=O=I6
17772886676 1个月前 (2021-12-15) 回复
-估咎列艘墩space.bilibili.com/589133151/channel/seriesdetail?sid=515876&DNG_=9_GUNbzt_717=Y=F0
-迫脊圃谪厦space.bilibili.com/589133151/channel/seriesdetail?sid=515875&GQB_=2_UCFiui_342=J=C3
-喜遮丝谴拷space.bilibili.com/589133151/channel/seriesdetail?sid=515874&TAL_=8_RQUier_779=F=N7
-荚旨悄肺亓space.bilibili.com/589133151/channel/seriesdetail?sid=515866&NLL_=3_YVGalv_282=E=N2
-抵律感史际space.bilibili.com/589133151/channel/seriesdetail?sid=515865&QIW_=6_PWUjvq_191=J=V0
17736674384 1个月前 (2021-12-15) 回复
1 2 3 4 5 6 7 8 9 10 ... »