Tengo una aplicación de aleteo como

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();
              },
            )

          ]),
        ),
      );

  }
}

Estoy llamando a una funcionalidad de comprobación de red desde otro archivo de dardos, así que

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
  }

}

}

Entonces mi pregunta es si la función checkNetwork() falla o la respuesta es "negativa", entonces quiero redirigir / mostrar otra página en main.dart u otra.

0
ramesh 24 abr. 2020 a las 20:19

2 respuestas

(nota: ajustar el código a continuación en un futuro con retraso de tiempo cero es solo para asegurarse de que el contexto estará listo cuando lo usemos)

 @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()));
     });
   });
  }
0
LoVe 24 abr. 2020 a las 17:40

Tengo una idea para esto, puedes hacer una de estas cosas:

  1. Deje que su función checkNetwork devuelva true o false, y luego use este valor booleano para determinar qué widget usar en el campo home del widget MaterialApp.
  2. Cree un nuevo widget, tal vez SplashScreen, que siempre será el que se use en el campo home de MaterialApp, y en este widget usted checkNetwork y haga el correcto {{X4 }} según el resultado booleano.

Personalmente prefiero el método 2 porque puede darte más control.

0
na2axl 24 abr. 2020 a las 17:38