Флаттер перенаправляет на новый экран, когда условие выполняется - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть приложение, похожее на флаттер, например

main.dart

import 'package:flutter/material.dart';
import 'network.dart';

void main() => runApp(HomePage());

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}


class _MyAppState extends State<HomePage> {
  String _message = '';
  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

  _register() {
    _firebaseMessaging.getToken().then((token) => print(token));
  }

  @override
  void initState() {
    super.initState();
    getMessage();

    TestNetwork.checkNetwork().then((val){
          print(val);
    });
  }

  void getMessage(){
    _firebaseMessaging.configure(
        onMessage: (Map<String, dynamic> message) async {
      print('on message $message');
      setState(() => _message = message["notification"]["title"]);
    }, onResume: (Map<String, dynamic> message) async {
      print('on resume $message');
      setState(() => _message = message["notification"]["title"]);
    }, onLaunch: (Map<String, dynamic> message) async {
      print('on launch $message');
      setState(() => _message = message["notification"]["title"]);
    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new MaterialApp(

        home: new Scaffold(
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text("Message: $_message"),
            OutlineButton(
              child: Text("Register My Devices"),
              onPressed: () {
                _register();
              },
            )

          ]),
        ),
      );

  }
}

Я вызываю функцию проверки сети из другого файла дротика, поэтому

network.dart

import 'package:http/http.dart' as http;
import 'dart:async';

class TestNetwork {

static String mainWebServiceURL="http://mydmain.com/webservicepath/";

static Future<bool> checkNetwork() async {
  try{
      Map<String,String> _user = {};
      _user['name'] = "Username";
      final response= await http.post(mainWebServiceURL+'/index.php',
        body: _user,
      );
      if(response.statusCode==200)
        return Future.value(true);
        else
        // I want to redierct to another page in main.dart page
  }
  catch (_) {
    // I want to redierct to another page in main.dart page
  }

}

}

Поэтому мой вопрос: если функция checkNetwork() не работает или ответ «отрицательный», я хочу перенаправить / показать другую страницу в main.dart или другую.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

У меня есть идея для этого, вы можете сделать одну из следующих вещей:

  1. Пусть ваша checkNetwork функция вернет true или false, а затем использовать это логическое значение для определения какой виджет использовать в поле home виджета MaterialApp.
  2. Создайте новый виджет, возможно, SplashScreen, который всегда будет тем, который используется в поле home MaterialApp, и в этом виджете вы checkNetwork и делаете правильные Navigator.push() в соответствии с логическим результатом.

Лично я предпочитаю метод 2, потому что он может дать вам больше контроля.

0 голосов
/ 24 апреля 2020

(примечание: перенос кода ниже в будущее с нулевым временем просто для того, чтобы убедиться, что контекст будет готов, когда мы его используем)

 @override
  void initState() {
    super.initState();
    getMessage();

   Future.delayed(Duration.zero,(){
     TestNetwork.checkNetwork().then((val){
       Navigator.of(context).push(MaterialPageRoute(builder: (ctx)=>MySuccessRoute()));
     },onError: (){
       Navigator.of(context).push(MaterialPageRoute(builder: (ctx)=>MyFailureRoute()));
     });
   });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...