首页 > 解决方案 > Dart 流数据长度检查

问题描述

我创建了以下 2 个流。

Stream 1 - 在特定时间调用异步函数的周期性流。

流 2 - 侦听流 1 然后创建流 2 的函数

我想添加逻辑,如果流 1 的长度大于 0,则只创建流 2。但我得到的流 1 的长度始终为 0。

我的代码如下。(它在热重载后运行)

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int _counter = 0;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyPage(),
    );
  }
}

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  StreamController<List<String>> _myStreamController =
      StreamController<List<String>>();
  int _counter = 0;

  Stream<List<String>> _stream() {
    Duration interval = Duration(milliseconds: 100);
    Stream<List<String>> stream =
        Stream<List<String>>.periodic(interval, temp2);

    return stream;
  }

  Future temp() async {
    List<String> a = [];
    _counter++;

    a.add(_counter.toString());
    return a;
  }

  List<String> temp2(int value) {
    List<String> _localMsg = List();
    temp().then((a) {
      print(a);
      _localMsg = a;
    });

    return _localMsg;
  }

  @override
  void initState() {
    super.initState();

    _stream().listen((ondata) {
      print(ondata);

      if (ondata.length > 0) _myStreamController.sink.add(ondata);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: StreamBuilder(
            stream: _myStreamController.stream,
            builder: (context, snapshot) {
              if (snapshot.data != null) {
                return Text(snapshot.data.toString());
              } else {
                return Text("waiting...");
              }
            },
          ),
        ),
      ),
    );
  }
}

标签: flutterdart

解决方案


推荐阅读