颤振 :触发 websocket 消息上的屏幕更改




我目前正在开发一个带有网络插座的颤振应用程序。我想在新消息上的 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 的代码提取到一个单独的类中,我将所有内容放在一个文件中只是为了使其更易于理解。

相关内容

  • 没有找到相关文章

最新更新