flutter 自定義websocket路由的實(shí)現(xiàn)
在 flutter websocket 中 服務(wù)端推送數(shù)據(jù)給客戶端后 很多人的處理居然都是 if / switch; 感覺(jué)這樣的寫(xiě)法不咋好!
自己想的一個(gè)辦法: 
在 lib 目錄下新建一個(gè) socket 目錄 里面創(chuàng)建兩個(gè)文件main.dart和router.dart; 
main.dart : 主要控制websocket的連接 斷開(kāi) 和收到消息的處理; 
router.dart 則為websocket 服務(wù)端返回的消息做路由處理;
router.dart
import 'package:lee/logic/user.dart';
typedef void RouteHandle(Map params);
var wsRouter = new WsRouter();
class WsRouter {
 static Map<String, RouteHandle> _routers = new Map();
 init() {
  routers.forEach((route) {
   route.forEach((name, value) {
    this.add(name, value);
   });
  });
 }
 // 增加路由
 void add(String name, RouteHandle handle) {
  WsRouter._routers[name] = handle;
 }
 // 路由處理
 Future<void> handle(String name, Map params) async {
  RouteHandle handle = WsRouter._routers[name];
  if (handle == null) {
   print("路由不存在");
   return;
  }
  handle(params);
 }
}
List<Map<String, RouteHandle>> routers = [
 {"login": UserLogic.login},
 {"kick": UserLogic.kick},
];
main.dart
import 'package:lee/socket/router.dart';
import 'package:web_socket_channel/io.dart';
import 'dart:convert';
var webSocket = new WebSocket();
class WebSocket {
 // webSocket連接
 IOWebSocketChannel webSocketChannel;
 factory WebSocket() => _webSocket();
 static WebSocket _instance;
 // 構(gòu)造函數(shù)
 WebSocket._() {
  // 初始化webSocket路由
  wsRouter.init();
 }
 static WebSocket _webSocket() {
  if (_instance == null) {
   _instance = WebSocket._();
  }
  return _instance;
 }
 conn() {
  IOWebSocketChannel channel = new IOWebSocketChannel.connect(
    "ws://127.0.0.1:8080/ws",
    pingInterval: Duration(milliseconds: 100));
  channel.stream
    .listen((data) => onMessage(data), onError: onError, onDone: onDone);
  this.webSocketChannel = channel;
 }
 onMessage(response) async {
  // 例如服務(wù)端返回的大概是這樣一個(gè)json
  // {"cmd":"kick","data":{}}
  // {"cmd":"login","data":{}}
  Map params = json.decode(response);
  wsRouter.handle(params["cmd"], params["data"]);
 }
 onError(err) async {}
 onDone() async {}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:Android Canvas的drawText()與文字居中方案詳解
欄 目:Android
下一篇:android studio 的下拉菜單Spinner使用詳解
本文標(biāo)題:flutter 自定義websocket路由的實(shí)現(xiàn)
本文地址:http://www.jygsgssxh.com/a1/Android/9008.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
 - 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
 - 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
 - 01-10android自定義圓形倒計(jì)時(shí)顯示控件
 - 01-10Android自定義圓環(huán)倒計(jì)時(shí)控件
 - 01-10Flutter適配深色模式的方法(DarkMode)
 - 01-10Flutter 滾動(dòng)監(jiān)聽(tīng)及實(shí)戰(zhàn)appBar滾動(dòng)漸變的實(shí)現(xiàn)
 - 01-10Flutter里面錯(cuò)誤捕獲的正確方法
 - 01-10Android實(shí)現(xiàn)自定義手勢(shì)和識(shí)別手勢(shì)的功能
 - 01-10Android 自定義驗(yàn)證碼輸入框的實(shí)例代碼(支持粘貼連續(xù)性)
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
 - 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方
 - 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
 - 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)
 - 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
 - 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代
 - 01-10android實(shí)現(xiàn)指紋識(shí)別功能
 - 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
 - 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
 - 01-10Emoji表情在Android JNI中的兼容性問(wèn)題詳
 
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
 - 01-10C#中split用法實(shí)例總結(jié)
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 04-02jquery與jsp,用jquery
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 


