zoukankan      html  css  js  c++  java
  • Flutter 避免阻塞ui线程

    import 'dart:async';
    import 'dart:isolate';
    
    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: HomePage(),
        );
      }
    }
    
    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      String _data = '';
      bool loading = true;
    
      @override
      void initState() {
        super.initState();
        _init();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: loading ? CircularProgressIndicator() : Text(_data),
          ),
        );
      }
    
      Future<void> _init() async {
        final worker = Worker();
        await worker.isReady;
        var data = await worker.getData();
        setState(() {
          _data = data;
          loading = false;
        });
        worker.dispose();
      }
    }
    
    class Worker {
      Isolate _isolate;
    
      /// 发送端口
      SendPort _sendPort;
    
      /// 接收端口
      ReceivePort _receivePort;
    
      final _isReady = Completer<void>();
      Future<void> get isReady => _isReady.future;
    
      final _data = Completer<String>();
      Future<String> get data => _data.future;
    
      Worker() {
        _init();
      }
      Future<void> _init() async {
        _receivePort = ReceivePort()..listen(_handleMessage);
    
        _isolate = await Isolate.spawn(
          _isolateEntry,
          _receivePort.sendPort,
        );
      }
    
      Future<String> getData() {
        _sendPort.send(null);
        return data;
      }
    
      void _handleMessage(dynamic message) {
        if (message is SendPort) {
          _sendPort = message;
          _isReady.complete();
          return;
        }
        _data.complete(message);
      }
    
      static void _isolateEntry(dynamic message) {
        SendPort sendPort;
        final receivePort = ReceivePort()
          ..listen((dynamic message) async {
            await Future.delayed(Duration(seconds: 1));
            var r = await http.get('http://192.168.0.104:3000');
            sendPort.send(r.body);
          });
    
        if (message is SendPort) {
          sendPort = message;
          sendPort.send(receivePort.sendPort);
        }
      }
    
      dispose() {
        _isolate.kill();
      }
    }
    
  • 相关阅读:
    sqoop安装并配置连接数据库
    Mapreduce自定义数据类型
    MapReduce入门(三)倒排索引
    复合式MapReduce之ChainJob
    android 各种xml的作用
    Android ViewPager实现软件的第一次加载的滑动效果
    Android调用系统相机和文件浏览器
    Android样式的编写格式
    Android 按钮按下效果
    Android圆角矩形的实现
  • 原文地址:https://www.cnblogs.com/ajanuw/p/11997369.html
Copyright © 2011-2022 走看看