Хорошо, я знаю, что поток может быть создан для прослушивания потока более одного раза, используя систему широковещания, но это конкретно НЕ то, что я пытаюсь сделать здесь.
Я также редактирую это, поскольку единственный ответ, который я получил, в настоящее время не может решить мою проблему, поэтому любая помощь будет принята с благодарностью.
Фактически по какой-то причине код, который у меня есть, не удаляет поток полностью, и при повторном использовании он пытается повторно прослушать тот же поток, который уже был прослушан и закрыт, ни один из которых не работает (очевидно ). Вместо того, чтобы пытаться снова прослушать тот же поток, я пытаюсь создать НОВЫЙ поток для прослушивания. (Удаление и очистка всей информации из исходного первого потока).
Исходный пост продолжается ниже:
Я использую шаблон DataStream для потоковой передачи данных в различные части моей программы и / или из них, и я не совсем уверен, как это исправить. Я уверен, что это глупая ошибка newb, но я недостаточно использовал DataStreams, чтобы понять, почему это происходит.
Не поймите меня неправильно, прохождение единственного цикла моей программы работает отлично, никаких проблем. Однако после того, как я завершил один цикл программы, если я попытаюсь пройти второй раз, я получаю сообщение об ошибке:
Плохое состояние: поток уже прослушан.
Итак, из этого я знаю, что моя программа не создает новый поток, а вместо этого пытается повторно использовать исходный поток, и я не на 100% уверен, как остановить эту функцию (или даже если я должен). (Честно говоря, количество раз, которое я ожидал бы завершения нескольких циклов, мало или равно нулю, но я хочу разрешать подобные ошибки до того, как они станут проблемами.)
Изменить: минимальный воспроизводимый пример для подражания
Файл 1 (main.dart)
import 'package:flutter/cupertino.dart';
import 'dart:async';
import './page2.dart';
import './stream.dart';
void main() => runApp(MyApp());
DataStream stream = DataStream();
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return CupertinoApp(
title: 'Splash Test',
theme: CupertinoThemeData(
primaryColor: Color.fromARGB(255, 0, 0, 255),
),
home: MyHomePage(title: 'Splash Test Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool textBool = false;
int counter = 0;
void changeTest(context) async {
int counter = 0;
Timer.periodic(Duration (seconds: 2), (Timer t) {
counter++;
stream.dataSink.add(true);
if (counter >= 3) {
t.cancel();
stream.dispose();
Navigator.pop(context);
}
},);
Navigator.push(context, CupertinoPageRoute(builder: (context) => Page2(stream: stream)));
}
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
child: Center(
child: CupertinoButton(
child: Text('To Splash'),
onPressed: () => changeTest(context),
),
),
);
}
}
Файл 2 (stream.dart)
import 'dart:async';
class DataStream {
StreamController _streamController;
StreamSink<bool> get dataSink =>
_streamController.sink;
Stream<bool> get dataStream =>
_streamController.stream;
DataStream() {
_streamController = StreamController<bool>();
}
dispose() {
_streamController?.close();
}
}
Файл 3 (page2.dart)
import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart';
import './main.dart';
import './stream.dart';
class Page2 extends StatefulWidget {
DataStream stream;
Page2({this.stream});
@override
State<StatefulWidget> createState() => new PageState();
}
class PageState extends State<Page2> {
bool textChanger = false;
bool firstText = true;
Text myText() {
if (textChanger) {
Text text1 = new Text('Text One',
style: TextStyle(color: Color.fromARGB(255, 0, 0, 0)));
return text1;
} else {
Text text1 = new Text('Text Two',
style: TextStyle(color: Color.fromARGB(255, 0, 0, 0)));
return text1;
}
}
void changeText() {
if (!firstText) {
if (textChanger) {
print('Change One');
setState(() {
textChanger = false;
});
} else {
print('Change Two');
setState(() {
textChanger = true;
});
}
} else {
firstText = false;
}
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Container(
child: Center(
child: myText()
)
),);
}
@override
void initState() {
super.initState();
widget.stream.dataStream.listen((onData) {
changeText();
});
}
}
Фактически, в этом примере вы можете щелкнуть текст и перейти на вторую страницу, которая правильно изменит текст, когда будет сказано, и вернется к исходной странице после завершения. Это был бы единственный «Цикл» моей программы.
И вы можете видеть, что эта программа немедленно избавляется от потока.
Проблема в том, что если я щелкаю текст во второй раз, он все еще пытается прослушать исходный поток, а не создает новый поток и начинает все заново.
Почему? И как мне это исправить?
stream
во втором блоке кода? из имеющегося у вас фрагмента, похоже, он никогда не будет повторно создан? - person emerssso   schedule 12.02.2020