Flutter - поставщик не обновляет состояние, застрявшее на экране загрузки - PullRequest
0 голосов
/ 21 февраля 2020

Мне нужно мнение эксперта. Я новичок в трепетании и не могу решить эту проблему.

Вот моя проблема:

Я создаю приложение, которое будет подключаться к MQTT. Подпишитесь на топи c. Скажите topi c A. После этого он опубликует sh что-то, что скажет Topi c B. Затем он получит некоторые инструкции в topi c A.

Так что, когда он инициализируется MQTT и проходя процесс подключения я хочу показать экран загрузки. Когда он завершит соединение, я хочу показать главный экран с просто текстом.

Это мой обработчик провайдера;

import 'package:dnb/screens/loading_screen.dart';
import 'package:dnb/screens/main_screen.dart';
import 'package:flutter/material.dart';
enum MQTTAppConnectionState { connected, disconnected, connecting }
class MQTTAppState with ChangeNotifier {
  MQTTAppConnectionState _appConnectionState =
      MQTTAppConnectionState.disconnected;
  void setAppConnectionState(MQTTAppConnectionState state) {
    _appConnectionState = state;
    notifyListeners();
  }
  MQTTAppConnectionState get getAppConnectionState => _appConnectionState;
  Widget get getRoute {
    return _appConnectionState == MQTTAppConnectionState.connected
        ? MainScreen()
        : LoadingScreen();
  }
}

Тогда это мой main.dart:

import 'package:dnb/services/MQTTAppState.dart';
import 'package:dnb/services/MQTTService.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(DigitalNoticeBoard());
class DigitalNoticeBoard extends StatefulWidget {
  @override
  _DigitalNoticeBoardState createState() => _DigitalNoticeBoardState();
}
class _DigitalNoticeBoardState extends State<DigitalNoticeBoard> {
  @override
  void initState() {
    mqttService();
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      home: ChangeNotifierProvider(
        create: (_) => MQTTAppState(),
        child: Scaffold(
          body: Consumer<MQTTAppState>(
              builder: (_, mqttAppState, __) => mqttAppState.getRoute),
        ),
      ),
    );
  }
}

Как вы можете видеть здесь в main.dart, я запускаю mqttService () в initState (). Когда я запускаю код, это то, что я получаю:

Performing hot restart...
Syncing files to device POCOPHONE F1...
Restarted application in 1,587ms.
I/flutter (16925): ::Mosquitto client connecting....
E/AccessibilityBridge(16925): VirtualView node must not be the root node.
I/flutter (16925): ::OnConnected client callback - Client connection was sucessful
I/flutter (16925): ::Mosquitto client connected
I/flutter (16925): ::Subscription confirmed -> topic -> topicName
I/flutter (16925): ::Change notification:: topic -> <topicName>, payload ->  <00010000011000000000> 

Это ожидаемый вывод, но мое приложение застревает на экране загрузки. В момент, когда распечатанный клиент подключился, мое приложение должно перейти на главный экран с экрана загрузки. Вот что я делаю в mqttService ():

try {
  mqttAppState.setAppConnectionState(MQTTAppConnectionState.connecting); //Passing connecting
  await client.connect();
} on Exception catch (e) {
  print('::client exception - $e');
  //client.disconnect();
}

, а затем:

/// Check we are connected
if (client.connectionStatus.state == MqttConnectionState.connected) {
  mqttAppState.setAppConnectionState(MQTTAppConnectionState.connected); //Passing connected
  print('::Mosquitto client connected');
} else {
  /// Use status here rather than state if you also want the broker return code.
  print(
      '::ERROR Mosquitto client connection failed - disconnecting, status is ${client.connectionStatus}');
  client.disconnect();
}

1 Ответ

0 голосов
/ 21 февраля 2020

@ Momshad Dinury

mqttService ()

try {
  mqttAppState.setAppConnectionState(MQTTAppConnectionState.connecting); //Passing connecting
  await client.connect();
} on Exception catch (e) {
  print('::client exception - $e');
  //client.disconnect();
}

Что такое mqttAppState для этой функции?

I думаю, что MQTTAppState в create: (_) => MQTTAppState () , а ваш mqttAppState отличается от

Возможно, вы попробуете это предложение:

MQTTAppState mqttAppState;

  @override
  void initState() {
    mqttAppState = MQTTAppState();
    mqttService();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ChangeNotifierProvider.value(
        value: mqttAppState,
        child: Scaffold(
          body: Consumer<MQTTAppState>(
              builder: (_, mqttAppState, __) => mqttAppState.getRoute),
        ),
      ),
    );
  }
...