簡體   English   中英

Flutter 條件為真時重定向到新屏幕

[英]Flutter redirect to a new screen when a condition is true

我有一個 flutter 應用程序

主要.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 文件調用 a.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() function 失敗或響應為“否定”,那么我想在 main.dart 或其他頁面中重定向/顯示另一個頁面。

(注意:將以下代碼包裝在零時間延遲的未來中只是為了確保在我們使用它時上下文准備就緒)

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

我對此有個想法,您可以執行以下操作之一:

  1. 讓您的checkNetwork function 返回truefalse ,然后使用這個 boolean 值來確定在MaterialApp小部件的home字段中使用哪個小部件。
  2. 創建一個新的小部件,可能是SplashScreen ,它始終是MaterialApphome字段中使用的小部件,在這個小部件中,您檢查網絡並根據checkNetwork結果執行正確的Navigator.push()

我個人更喜歡方法 2,因為它可以給你更多的控制權。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM