【问题标题】:Loading multiple streams in StringBuilder, one stream after the other在StringBuilder中加载多个流,一个接一个
【发布时间】:2020-05-11 20:35:05
【问题描述】:

我是 Dart Streams 的新手,很难弄清楚这一点。

基本上,我有一个用于文件下载的流,然后是另一个用于文件处理的流。文件下载流只能在文件处理流之后初始化,因为它依赖于下载的文件。

我需要显示一个进度小部件,从 0 到 100%,然后再从 0 到 100%。

我尝试使用 rxDart concatWith 来合并流,但它不起作用。 ConnectionState.done 在第一个流上被调用,它不听另一个。我也不确定这是否是正确的方法。

如果我尝试在构建器中设置新流,我会收到此错误:

在构建期间调用 setState() 或 markNeedsBuild()。

builder: (context, snapshot) {
      print(snapshot.connectionState);

      if (snapshot.connectionState == ConnectionState.done) {
        setState(() {
          stream =
              Stream.periodic(Duration(seconds: 1), (i) => _source2[i]).take(_source2.length); // New Stream
        });
      }

这样做的好方法是什么?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我能够通过添加解决我的问题

    WidgetsBinding.instance.addPostFrameCallback((_){
    

    在构建器中。

    这是一个简单的例子,一个接一个地输出两个流:

    import 'dart:async';
    import 'package:flutter/material.dart';
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return new _MyAppState();
      }
    }
    
    class _MyAppState extends State<MyApp> {
      var stream; // state variable
    
      List<String> _source = ['a', 'b', 'c', 'd', 'e', 'f'];
      List<String> _source2 = ['g', 'h', 'i'];
    
      var _count = 0;
    
      @override
      void initState() {
        super.initState();
        // stream = newStream(); // initial stream
    
        stream = Stream.periodic(Duration(seconds: 1), (i) => _source[i]).take(_source.length);
      }
    
      @override
      Widget build(BuildContext context) {
        var streamBuilder = StreamBuilder(
            initialData: "0",
            stream: stream,
            builder: (context, snapshot) {
              print(snapshot.connectionState);
    
              if (snapshot.connectionState == ConnectionState.done) {
                _count++;
                if (_count < 2) {
                  WidgetsBinding.instance.addPostFrameCallback((_) {
                    setState(() {
                      stream = Stream.periodic(Duration(seconds: 1), (i) => _source2[i])
                          .take(_source2.length);
                    });
                  });
                }
              }
    
              if (snapshot.hasData) {
                print(snapshot.data);
                return new Text(snapshot.data);
              } else {
                return new Text('no data');
              }
            });
        return MaterialApp(
            title: 'Trial',
            home: Scaffold(
                appBar: AppBar(title: Text('Stream builder')),
                body: Column(
                  children: <Widget>[
                    streamBuilder,
                  ],
                )));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 2021-06-30
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多