我目前正在开发一个带有网络插座的颤振应用程序。我想在新消息上的 websocket 触发的方法中使用Navigator.pushNamed(context, '/path')
更改当前屏幕。问题是我对这种方法没有任何context
。
那么如何从这种方法更改当前屏幕呢?
我不知道是我的想法错了,还是我只是不明白什么。
这是在新的 websocket 消息上触发的方法,他的类不是小部件。此对象包含在我创建的每个屏幕中,但他的变量_parent
始终设置为与活动屏幕匹配。
onMessageReceived(data) {
print("new message: " + data + " !");
data = jsonDecode(data);
data.forEach((key, value) {
switch (key) {
case "state":
_parent.newState(value);
break;
}
});
}
这是小部件的方法:
newState(state){
if(state == "start"){
Navigator.pushNamed(, "/path");
}
}
提前致谢
您可以使用流来实现此目的。您可以注册 websocket 响应,当它返回时,您可以将其添加到流中,然后在屏幕上使用 StreamBuilder 订阅流并在需要时导航。像这样:
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
// Create a stream to receive the values
var webSocketStream = new BehaviorSubject<String>();
onMessageReceived(data) {
print("new message: " + data + " !");
data = jsonDecode(data);
data.forEach((key, value) {
switch (key) {
case "state":
// Write to the stream
webSocketStream.add(value);
break;
}
});
}
class CheckWebSocket extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder<String>(
// Subscribe to the stream
stream: webSocketStream,
builder: (context, snapshot) {
// When the stream changes navigate
if (snapshot.hasData && snapshot.data == "start") {
Navigator.pushNamed(context, "/path");
} else {
return Container();
}
}),
);
}
}
我为此使用了 rxdart,因为它使处理流变得更加简单。我还建议您将读取 websocket 的代码提取到一个单独的类中,我将所有内容放在一个文件中只是为了使其更易于理解。