Flutter多线程_Flutter一次并发请求多个接口

Flutter是个单线程语言, async只是时间片的切换,那么Flutter如何模拟多线程实现Flutter一次并发请求多个接口呢?

Flutter一次并发请求多个接口可以商用 Future.await方法实现

我们在项目开发中的会遇到一个页面同时请求多个接口的情况,而且接口是同时发出的并发请求,正常接口请求一般都是通过dio进行封装过后的,如下:

//创建数据请求

requestBannerListData(){
   DioUtils.postHttp("student/banner/getPublicList", onSuccess: (data){
     final bannerModel = bannerModelFromJson(jsonEncode(data));
     _bannerList.clear();
     _bannerList.addAll(bannerModel);
   }, onError: (int code, String error) {

   });  
 }

通常一个接口请求会如上所示.为了方便我们获取到数据直接使用,返回的数据通常也不是Future类型的,那么多个接口一起并发请求时该怎么处理呢,肯定不是一个接口一个接口顺序去调用,此时我们会用Future提供的一个方法,Future.await去请求数据,但要注意的是Future.await要求传入返回Future类型的数据,显然我们封装的接口不满足.改造后的代码如下

_getAllData() async{
   await Future.wait<dynamic>([requestBannerListData(),requestVideoListData()]).then((value){
     _isSuccessLoad = true;
     _bannerList.clear();
     _bannerList.addAll(value[0]);
     _videoList.clear();
     _videoList.addAll(value[1]);
     ProgressDialog.hideProgress(this.context);
     setState(() {
       // 重置刷新状态 
       _controller.resetLoadState();
     });
   }).catchError((error){

   });
 }

//创建数据请求

requestBannerListData() async{
   var result;
   await Future(()=> DioUtils.postHttp("student/banner/getPublicList", onSuccess: (data){
     final bannerModel = bannerModelFromJson(jsonEncode(data));
     result = bannerModel;
   }, onError: (int code, String error) {

   }));
    return result;
 }

//创建数据请求

requestVideoListData() async{
   //ProgressDialog.showProgress(context);
   Map<String, dynamic> parma = {
     "sectionId": "3",
     "sortType": _sortId,
     "page": 1,
     "subjectId": _subjectId
   };
   var result;
  await Future(()=> DioUtils.postHttp("trs/getVideos", parameters: parma, onSuccess: (data) {
      final listmodel = videoListModelFromJson(jsonEncode(data));
      result = listmodel;
   }, onError: (int code, String error) {
     
   }));
  return result;
 }
 

如上就完成了多接口的并发请求,当两个接口都请求成功拿到数据之后,Future.await的value就是两个接口结果组成的数组,然后再进行数据的操作和页面的刷新。更多Flutter知识点学习:Dart Flutter入门实战基础教程下载地址-2023年录制

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用 Flutterflutter_blue 包读取 BLE 设备的代码示例: 首先,需要在 pubspec.yaml 文件中添加 flutter_blue 依赖: ```yaml dependencies: flutter: sdk: flutter flutter_blue: ^0.7.3 ``` 然后在 Dart 文件中导入 flutter_blue 包: ```dart import 'package:flutter_blue/flutter_blue.dart'; ``` 接下来,我们可以创建一个 StatefulWdiget 来管理连接状态和搜索结果: ```dart class BleDeviceScreen extends StatefulWidget { @override _BleDeviceScreenState createState() => _BleDeviceScreenState(); } class _BleDeviceScreenState extends State<BleDeviceScreen> { FlutterBlue flutterBlue = FlutterBlue.instance; StreamSubscription<ScanResult> scanSubscription; BluetoothDevice connectedDevice; List<BluetoothDevice> devicesList = []; void startScan() { scanSubscription = flutterBlue.scan().listen((scanResult) { if (!devicesList.contains(scanResult.device)) { setState(() { devicesList.add(scanResult.device); }); } }); } void stopScan() { scanSubscription?.cancel(); } void connectToDevice(BluetoothDevice device) async { await device.connect(); setState(() { connectedDevice = device; }); } void disconnectFromDevice() async { await connectedDevice.disconnect(); setState(() { connectedDevice = null; }); } @override void initState() { super.initState(); startScan(); } @override void dispose() { stopScan(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('BLE Device'), ), body: Column( children: [ Expanded( child: ListView.builder( itemCount: devicesList.length, itemBuilder: (BuildContext context, int index) { BluetoothDevice device = devicesList[index]; return ListTile( title: Text(device.name), subtitle: Text(device.id.toString()), trailing: connectedDevice == device ? FlatButton( child: Text('Disconnect'), onPressed: disconnectFromDevice, ) : FlatButton( child: Text('Connect'), onPressed: () => connectToDevice(device), ), ); }, ), ), connectedDevice != null ? StreamBuilder<List<int>>( stream: connectedDevice.characteristic( Guid("00002a37-0000-1000-8000-00805f9b34fb")), builder: (BuildContext context, AsyncSnapshot<List<int>> snapshot) { if (snapshot.hasData) { List<int> value = snapshot.data; String result = String.fromCharCodes(value); return Text('Result: $result'); } else { return Text('No result yet'); } }, ) : Container(), ], ), ); } } ``` 在 initState 方法中,我们调用 startScan 方法开始扫描周围的 BLE 设备,并通过 StreamSubscription 监听扫描结果。每当扫描到一个新设备时,将其添加到 devicesList 中,并使用 setState 更新 UI。 在 ListView 中,我们将扫描到的设备显示为列表项,并提供连接和断开连接的按钮。如果设备已连接,则显示断开连接按钮。我们还为每个设备添加了一个 onTap 方法,以便在点击设备时连接到该设备。 如果已连接到设备,则会在页面底部显示一个 StreamBuilder,用于从设备读取数据。我们使用 characteristic 方法获取一个 characteristic,并使用 StreamBuilder 监听该 characteristic 的值。如果有新的值,则将其显示在页面上。 最后,我们在 dispose 方法中停止扫描并取消 StreamSubscription。 这就是一个简单的使用 Flutterflutter_blue 包读取 BLE 设备的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值