Flutter:如何使用 Firestore 检查连接性

Posted

技术标签:

【中文标题】Flutter:如何使用 Firestore 检查连接性【英文标题】:Flutter : how to check connectivity using firestore 【发布时间】:2020-07-28 17:22:49 【问题描述】:

如何检查连接并仅在有互联网连接时显示图像,否则显示循环进度指示器。在我的以下代码中,即使没有互联网连接,指示器也只会出现一秒钟。

class About extends StatelessWidget    
    List<Image> _listOfImages = <Image>[];
    @override
    Widget build(BuildContext context) 
    SizeConfig().init(context);
    return Scaffold(    
      body:     ListView(
        scrollDirection: Axis.vertical,
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(
                left: SizeConfig.safeBlockHorizontal * 5,
                top: SizeConfig.safeBlockHorizontal * 5,
                right: SizeConfig.safeBlockHorizontal * 5),
            child: Material(
              borderRadius: BorderRadius.circular(24.0),
              child: SizedBox(
                width: SizeConfig.safeBlockHorizontal * 80,
                height: SizeConfig.safeBlockHorizontal * 80,
                
                child: StreamBuilder<QuerySnapshot>(
                stream: Firestore.instance.collection('About').snapshots(),
   
                builder: (context, snapshot) 
                  if (snapshot.data.documents.length == 0)
                    return Center(
                        child: 
                                CircularProgressIndicator()
                      );                   
                  
                   else 
                   return ListView.builder(
                      
                        itemCount: snapshot.data.documents.length,
                        itemBuilder: (BuildContext context, int index) 
                          _listOfImages = [];

【问题讨论】:

【参考方案1】:

检查这个包:

Connectivity Flutter

这是一个很棒的包/库,可以为您完成这项工作。要利用它,只需导入并执行以下示例:

      Future<bool> check() async 
        var connResult = await (Connectivity().checkConnectivity());
        if (connResult == ConnectivityResult.mobile) 
          return true;
         else if (connResult == ConnectivityResult.wifi) 
          return true;
        
        return false;
      

请注意,在 android 上,这并不能保证连接到互联网。例如,该应用可能具有 wifi 访问权限,但它可能是 *** 或无法访问的酒店 WiFi。

替代用法

主要思想是检查链接是否可以打开,在这种情况下我们使用google.com。然后,您可以返回您的 boolean 以根据该信息做您的工作。

import 'dart:io'

bool isConnected = false;
// use try-catch to do this operation, so that to get the control over this 
// operation better
try
  final result = await InternetAddress.lookup('google.com');
  if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) 
    // do the operation for connected, or change the bool to True for connected
    setState(() => isConnected = true);
  
 on SocketException catch (_) 
   setState(() => isConnected = false);

要了解更多InternetAddress,请关注:InternetAddress Class。

【讨论】:

@Aju 您可以将其添加到任何地方,但将其添加到您的initState() 会更好。从那里您可以通过一些bool value 获得您的connection status。然后在您调用API的地方,检查bool值,然后执行操作。希望这是有道理的 对不起,我不明白。你能把它和我上面的代码联系起来吗? 当互联网不存在@Aju 时你想发生什么? if (snapshot.data.documents.length == 0) return Center( child: CircularProgressIndicator() // 我要检查是否有连接,如果没有连接我要打印进度指示器 // ); else return ListView.builder // 否则我想打印这个小部件 这与 Cloud Firestore 有关吗?

以上是关于Flutter:如何使用 Firestore 检查连接性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flutter future<bool> 检查 Firestore 中是不是存在子集合

如何检查 Flutter Firestore 中是不是存在用户文档?

如何在 FireStore 中获取 isAdmin 字段并在 Flutter 中检查它是真还是假

检查 Flutter Firestore 中是不是已存在字段

如何使用 Firestore 在 Flutter 中搜索文本

无法构建flutter插件cloud_firestore,因为CloudFirestorePlugin.java使用未经检查或不安全的操作[flutter build apk]