gpt4 book ai didi

ios - 当 BLOC 中的流值发生变化时导航到新屏幕

转载 作者:IT老高 更新时间:2023-10-28 12:31:45 26 4
gpt4 key购买 nike

在 Flutter 中,当流的值发生变化时,我将如何调用 Navigator.push?我尝试了下面的代码,但出现错误。

StreamBuilder(
stream: bloc.streamValue,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
if (snapshot.hasData && snapshot.data == 1) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SomeNewScreen()),
);
}

return Text("");
});

enter image description here

最佳答案

您不应使用 StreamBuilder 来处理导航。StreamBuilder 用于构建屏幕内容,仅此而已。

相反,您必须收听流以手动触发副作用。这是通过使用 StatefulWidget 并覆盖 initState/dispose 来完成的:

class Example extends StatefulWidget {
final Stream<int> stream;

const Example({Key key, this.stream}) : super(key: key);

@override
ExampleState createState() => ExampleState();
}

class ExampleState extends State<Example> {
StreamSubscription _streamSubscription;

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

@override
void didUpdateWidget(Example oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.stream != widget.stream) {
_streamSubscription.cancel();
_listen();
}
}

void _listen() {
_streamSubscription = widget.stream.listen((value) {
Navigator.pushNamed(context, '/someRoute/$value');
});
}

@override
void dispose() {
_streamSubscription.cancel();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Container();
}
}

请注意,如果您使用 InheritedWidget 来获取您的流(通常是 BLoC),您将需要使用 didChangeDependencies 而不是 initState/didUpdateWidget.

这导致:

class Example extends StatefulWidget {
@override
ExampleState createState() => ExampleState();
}

class ExampleState extends State<Example> {
StreamSubscription _streamSubscription;
Stream _previousStream;

void _listen(Stream<int> stream) {
_streamSubscription = stream.listen((value) {
Navigator.pushNamed(context, '/someRoute/$value');
});
}

@override
void didChangeDependencies() {
super.didChangeDependencies();
final bloc = MyBloc.of(context);
if (bloc.stream != _previousStream) {
_streamSubscription?.cancel();
_previousStream = bloc.stream;
_listen(bloc.stream);
}
}

@override
void dispose() {
_streamSubscription.cancel();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Container();
}
}

关于ios - 当 BLOC 中的流值发生变化时导航到新屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54101589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com