Flutter: вызвать изменение экрана в сообщении websocket - PullRequest
0 голосов
/ 12 февраля 2019


В настоящее время я работаю над приложением флаттера с веб-сокетом.Я хочу изменить текущий экран с помощью 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");
    }
  }

Заранее спасибо

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете использовать поток для этого.Вы можете зарегистрировать ответ 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, потому что это упрощает работу с потоками.Я также рекомендую вам извлечь код, который читает веб-сокет, в отдельный класс, я поместил все в один файл, чтобы было проще понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...