Flutter Stream 简单的使用

一  简单使用

import 'dart:async';

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  /// 1 创建
  StreamController<List<String>> _dataController = StreamController();

  /// 2 获取streamSink 做 add 入口
  StreamSink get _dataSink => _dataController.sink;

  /// 3 获取Stream 用于监听
  Stream<List<String>> get _dataStream => _dataController.stream;

  /// 4 事件订阅对象
  StreamSubscription? _dataSubScription;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // 监听事件
    _dataSubScription = _dataStream.listen((event) {
      print(event);
    });
  }

  onClick() {
    // 改变事件
    _dataSink.add(["111"]);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("data"),
        ),
        body: Column(
          children: [ElevatedButton(onPressed: onClick, child: Text("触发事件"))],
        ));
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _dataSubScription!.cancel();
    _dataController.close();
    super.dispose();
  }
}

二 一个栗子

请求网络数据创建流

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  static Dio _dio =
      Dio(BaseOptions(baseUrl: "https://interface.meiriyiwen.com"));

  static Future<Map> _getArtical() async {
    Response response =
        await _dio.get('/article/random', queryParameters: {"dev": 1});
    final data = response.data['data'];
    return data;
  }

  Stream<Map>? _futureStream;

  @override
  void initState() {
    // TODO: implement initState
    List<Future<Map>> futures = [];
    for (var i = 0; i < 10; i++) {
      // 添加future
      futures.add(_getArtical());
    }
    // 生成Stream
    _futureStream = Stream<Map>.fromFutures(futures);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Random Artical"),
        ),
        body: SingleChildScrollView(
          child: Center(
            child: StreamBuilder(
              stream: _futureStream,
              builder: (context, AsyncSnapshot snapshot) {
                if (snapshot.hasData) {
                  Map article = snapshot.data;
                  return Container(
                    child: Column(
                      children: [
                        Text(article["title"]),
                        Text(article['content'])
                      ],
                    ),
                  );
                }
                return CircularProgressIndicator();
              },
            ),
          ),
        ));
  }

  @override
  void dispose() {
    // TODO: implement dispose

    super.dispose();
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值