颤动流未关闭

时间:2021-03-14 18:44:14

标签: flutter dart

当屏幕关闭我的代码时,我想处理数据流 main.dart

import 'package:flutter/material.dart';

import 'first.dart';

void main() {
runApp(MaterialApp(
home: First(),

    ));
}

FirstScreen.dart

import 'package:flutter/material.dart';
import 'package:flutter_app/scond.dart';

class First extends StatefulWidget {
  @override
  _FirstState createState() => _FirstState();
}

class _FirstState extends State<First> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: InkWell(
            onTap: () {
              Navigator.of(context).push(MaterialPageRoute(
                builder: (context) => Second(),
              ));
            },
            child: Text("Next Page !")),
      ),
    );
  }
}

secondScreen.dart

import 'dart:async';

import 'package:flutter/material.dart';

class Second extends StatefulWidget {
  @override
  _SecondState createState() => _SecondState();
}

class _SecondState extends State<Second> {
  @override
  void initState() {
    super.initState();
    zzzzzz();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
    );
  }

  void zzzzzz() async {
    for (int i = 0; i < 100; i++) {
      await Future.delayed(Duration(milliseconds: 150));
      print("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz $i");
    }
  }
}

如果我从第二个屏幕返回,这个 for 循环需要 20 scend 才能完成,for 循环仍然继续! 处理屏幕后如何阻止未来等待的for循环继续?

1 个答案:

答案 0 :(得分:1)

import 'dart:async';

import 'package:flutter/material.dart';

class Second extends StatefulWidget {
  @override
  _SecondState createState() => _SecondState();
}

class _SecondState extends State<Second> {
  StreamController<String> streamController = StreamController();

  @override
  void initState() {
    super.initState();
    streamController.stream.listen((messages) => print(messages));
    startAddMessages();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
    );
  }

  @override
  void dispose() {
    super.dispose();
    streamController.close();
  }
  void startAddMessages() async {
    for (int i = 0; i < 100; i++) {
      await Future.delayed(Duration(milliseconds: 150));
      try {
        streamController
            .add("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz $i");
      } catch (err) {
        print("Error while add is ${err.toString()}");
        break;
      }
      print("item Added $i");
    }
  }
}