【问题标题】:Flutter redirect to a new screen when a condition is true当条件为真时,颤振重定向到新屏幕
【发布时间】:2020-08-08 08:28:23
【问题描述】:

我有一个类似的颤振应用程序

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 或其他页面中重定向/显示另一个页面。

【问题讨论】:

    标签: android flutter dart flutter-layout


    【解决方案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()));
         });
       });
      }
    

    【讨论】:

    • 我只想从几乎所有页面中检查这个网络功能。所以我决定在函数内部做 if..else 部分
    • 这将是一个不干净的解决方案,将业务逻辑与 UI 混合(因为在这种情况下,您需要将上下文传递给您的函数,而该函数应该对 UI 一无所知),所以我建议使用答案中的解决方案
    【解决方案2】:

    我有一个想法,你可以做以下事情之一:

    1. 让您的checkNetwork 函数返回truefalse,然后使用此布尔值确定在MaterialApp 小部件的home 字段中使用哪个小部件。
    2. 创建一个新的小部件,可能是SplashScreen,它总是在MaterialApphome 字段中使用,在这个小部件中你checkNetwork 并根据布尔结果执行正确的Navigator.push() .

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 2021-04-21
      • 1970-01-01
      • 2019-11-25
      • 2020-10-10
      • 2020-02-19
      • 2021-07-12
      • 1970-01-01
      相关资源
      最近更新 更多