【问题标题】:Flutter Future<bool> vs bool typeFlutter Future<bool> 与 bool 类型
【发布时间】:2023-04-11 07:14:03
【问题描述】:

我的 Flutter 项目有一个 utility.dart 文件和一个 main.dart 文件。我调用 main.dart 文件中的函数,但它有问题。它总是显示警报“OK”,我认为问题是实用程序类 checkConnection() 返回了一个未来的 bool 类型。

main.dart:

if (Utility.checkConnection()==false) {
  Utility.showAlert(context, "internet needed");
} else {
  Utility.showAlert(context, "OK");
} 

utility.dart:

import 'package:flutter/material.dart';
import 'package:connectivity/connectivity.dart';
import 'dart:async';

class Utility {


  static Future<bool> checkConnection() async{

    ConnectivityResult connectivityResult = await (new Connectivity().checkConnectivity());

    debugPrint(connectivityResult.toString());

    if ((connectivityResult == ConnectivityResult.mobile) || (connectivityResult == ConnectivityResult.wifi)){
      return true;
    } else {
      return false;
    }
  }

  static void showAlert(BuildContext context, String text) {
    var alert = new AlertDialog(
      content: Container(
        child: Row(
          children: <Widget>[Text(text)],
        ),
      ),
      actions: <Widget>[
        new FlatButton(
            onPressed: () => Navigator.pop(context),
            child: Text(
              "OK",
              style: TextStyle(color: Colors.blue),
            ))
      ],
    );

    showDialog(
        context: context,
        builder: (_) {
          return alert;
        });
  }
}

【问题讨论】:

    标签: flutter future


    【解决方案1】:

    您需要从Future&lt;bool&gt; 中取出bool。使用可以then blockawait

    用 then 块

    _checkConnection() {
      Utiliy.checkConnection().then((connectionResult) {
        Utility.showAlert(context, connectionResult ? "OK": "internet needed");
      })
    }
    

    等待

    _checkConnection() async {
     bool connectionResult = await Utiliy.checkConnection();
     Utility.showAlert(context, connectionResult ? "OK": "internet needed");
    }
    

    更多详情,请参考here

    【讨论】:

      【解决方案2】:

      在Future函数中你必须返回未来的结果,所以你需要改变:

      return true;
      

      收件人:

      return Future<bool>.value(true);
      

      所以具有正确返回的完整功能是:

       static Future<bool> checkConnection() async{
      
          ConnectivityResult connectivityResult = await (new Connectivity().checkConnectivity());
      
          debugPrint(connectivityResult.toString());
      
          if ((connectivityResult == ConnectivityResult.mobile) || (connectivityResult == ConnectivityResult.wifi)){
            return Future<bool>.value(true);
          } else {
            return Future<bool>.value(false);
          }
        }
      

      【讨论】:

        【解决方案3】:

        我也遇到过这个问题,所以我试图通过简单的方法解决,但我不能。我试图在不同的不同页面中实现布尔值。

        import 'package:connectivity_plus/connectivity_plus.dart';
        class Connection{
          static String msg  = "";
          //Check Internet Connection
        
          static Future<bool> connection() async{
            //result = await _connectivity.checkConnectivity();
            Connectivity _connectivity = Connectivity();
            late ConnectivityResult result;
            result = await _connectivity.checkConnectivity();
            if(result == ConnectivityResult.mobile){
              //msg = "Connected with Mobile";
              return Future<bool>.value(true);
            }else if(result == ConnectivityResult.wifi){
              //msg = "Connected with WiFi";
              return Future<bool>.value(true);
            }
            else if(result == ConnectivityResult.ethernet){
             // msg = "Connected with Ethernet";
              return Future<bool>.value(true);
            }
            return Future<bool>.value(false);
          }
        }
        

        你可以用这个

        import 'dart:async';
        
        import 'package:flutter/material.dart';
        import 'package:connectivity_plus/connectivity_plus.dart';
        import 'package:quizzes_application/Alert.dart';
        
        class Connection extends StatefulWidget {
          const Connection({Key? key}) : super(key: key);
        
          @override
          _ConnectionState createState() => _ConnectionState();
        }
        
        class _ConnectionState extends State<Connection> {
          
          //Connection Test
        
          static bool isConnected = true;
          late StreamSubscription sub;
          //Internet Connectivity Check
          void initState(){
            super.initState();
            sub = Connectivity().onConnectivityChanged.listen((result) {
              setState(() {
                isConnected = (result == ConnectivityResult.none);
              });
            });
          }
          void dispose(){
            sub.cancel();
            super.dispose();
          }
          
          @override
          Widget build(BuildContext context) {
            return isConnected ? Scaffold() : Alert.alertMsg();
          }
        }
        

        【讨论】:

        • 不幸的是,这并没有回答这个问题。考虑删除。
        • 是的,这就是为什么我在下面发布使用第二个
        猜你喜欢
        • 2019-07-08
        • 2021-11-24
        • 2019-12-05
        • 1970-01-01
        • 2023-01-03
        • 2020-08-25
        • 1970-01-01
        • 2021-10-16
        • 2021-10-10
        相关资源
        最近更新 更多