条件为真时,颤振重定向到新屏幕

时间:2020-04-24 17:19:51

标签: android flutter dart flutter-layout

我有一个像扑扑的应用程序

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

          ]),
        ),
      );

  }
}

我正在从另一个dart文件调用网络检查功能,所以

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 个答案:

答案 0 :(得分:1)

对此我有个主意,您可以执行以下其中一项操作:

  1. 让您的checkNetwork函数返回truefalse,然后使用此布尔值确定在{{1}的home字段中使用哪个窗口小部件}小部件。
  2. 创建一个新的小部件,也许是MaterialApp,它将始终是SplashScreen的{​​{1}}字段中使用的小部件,在此小部件中,您home并执行适当的操作MaterialApp根据布尔结果。

我个人更喜欢方法2,因为它可以给您更多控制权。

答案 1 :(得分:1)

(注意:在零时延的将来包装下面的代码只是为了确保在使用上下文时可以使用它)

 @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()));
     });
   });
  }
相关问题