ফ্লার্ট অ্যাপে কোনও ইন্টারনেট সংযোগ পাওয়া যায় কিনা তা পরীক্ষা করে দেখুন


99

আমার একটি নেটওয়ার্ক কল কার্যকর করা হবে। তবে এটি করার আগে আমার ডিভাইসটির ইন্টারনেট সংযোগ আছে কিনা তা যাচাই করা দরকার।

আমি এ পর্যন্ত এটিই করেছি:

  var connectivityResult = new Connectivity().checkConnectivity();// User defined class
    if (connectivityResult == ConnectivityResult.mobile ||
        connectivityResult == ConnectivityResult.wifi) {*/
    this.getData();
    } else {
      neverSatisfied();
    }

উপরে পদ্ধতিটি কাজ করছে না।

উত্তর:


192

সংযোগ প্লাগ ইন এর ডক্সে বলে যে এটি শুধুমাত্র তথ্য প্রদান করে যদি একটি নেটওয়ার্ক সংযোগ নেই, কিন্তু যদি নেটওয়ার্কের ইন্টারনেটের সাথে সংযুক্ত করা হয় না

নোট করুন যে অ্যান্ড্রয়েডে, এটি ইন্টারনেটের সাথে সংযোগের নিশ্চয়তা দেয় না। উদাহরণস্বরূপ, অ্যাপটিতে ওয়াইফাই অ্যাক্সেস থাকতে পারে তবে এটি কোনও ভিপিএন বা কোনও অ্যাক্সেস ছাড়াই একটি হোটেল ওয়াইফাই হতে পারে।

তুমি ব্যবহার করতে পার

import 'dart:io';
...
try {
  final result = await InternetAddress.lookup('google.com');
  if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
    print('connected');
  }
} on SocketException catch (_) {
  print('not connected');
}

4
আমি ত্রুটি পাচ্ছি "isNotEmpty InternetAddress এর ভিতরে ঘোষণা করা হয়নি"
রিসমন সুরেশ

4
এটি কি পটভূমিতে অর্জন করা যায়? আমার যেমন মৃত্যুদন্ড কার্যকর করার জন্য এবং ইন্টারনেটের জন্য অপেক্ষা করার কাজগুলির একটি সারি রয়েছে তবে অ্যাপটি বন্ধ আছে?
ভিডর ভিস্ট্রোম

60
দয়া করে মনে রাখবেন যে গুগল ডট কম চীনের অভ্যন্তরে অ্যাক্সেসযোগ্য নয় এবং যেমন উদাহরণস্বরূপ চীনে ব্যবহৃত হয় তবে এটি স্তব্ধ হয়ে যাবে। আপনার শ্রোতাদের প্রসারিত করার জন্য দয়া করে google.com ব্যবহার এড়িয়ে চলুন এবং এর পরিবর্তে example.com ব্যবহার করুন। চূড়ান্ত ফলাফল = ইন্টারনেটএড্রেস.লুকআপের প্রতীক্ষা ('উদাহরণ.কম');
অটোবস

4
এই জন্য আমাকে কাজ করে না if (result.isNotEmpty && result[0].rawAddress.isNotEmpty)আছে যখন ওয়াইফাই কিন্তু ইন্টারনেট সংযোগ সত্য ফেরৎ।
ডেন

4
ওহ, হ্যাঁ, আমি এই সম্পর্কে সম্পূর্ণ ভুলে গেছি! আসলে আমি মনে করি আমি ব্যবহার চালিয়ে যেতে পারি await, আমি কেবল .timeoutপরে সংযোজন করতে পারি lookup()
মিশেল ফিনস্টেইন

73

এখানে অবতীর্ণ অন্য যে কোনও ব্যক্তির জন্য আমি জন্টার জ্যাচবাউরের জবাবটি যোগ করতে চাই এটি একটি ইউটিলিটি বাস্তবায়নের জন্য আমার সমাধান ছিল যে ইন্টারনেট আছে কিনা তা জানার জন্য বা অন্য কিছু নির্বিশেষে।

দাবি অস্বীকার:

আমি ডার্ট এবং ফ্লাটার দুটিতেই নতুন তাই এটি সর্বোত্তম পদ্ধতির নাও হতে পারে তবে প্রতিক্রিয়া পেতে পছন্দ করবেন।


ঝাঁকুনি_সংযোগ এবং গন্টার জ্যাচবাউয়ারের সংযোগ পরীক্ষার সংমিশ্রণ

আমার প্রয়োজনীয়তা

সংযোগটি যাচাই করার জন্য আমার যে কোনও জায়গায় পুনরাবৃত্ত কোডের প্রয়োজন নেই এবং আমি চাইতাম যে কোনও সংশোধন ঘটে যখনই সংযোগের বিষয়ে যত্নশীল এমন উপাদান বা অন্য যে কোনও কিছু স্বয়ংক্রিয়ভাবে আপডেট করা হোক।

সংযোগ স্ট্যাটাসসিংলেটন

প্রথমে আমরা একটি সিঙ্গলটন সেটআপ করি। আপনি যদি এই প্যাটার্নটির সাথে অপরিচিত থাকেন তবে তাদের সম্পর্কে অনলাইনে প্রচুর ভাল তথ্য রয়েছে। তবে সংক্ষিপ্তসারটি হ'ল আপনি প্রয়োগ জীবন চক্র চলাকালীন কোনও শ্রেণীর একক উদাহরণ তৈরি করতে এবং এটি যে কোনও জায়গায় ব্যবহার করতে সক্ষম হতে চান।

এই সিঙ্গলটন flutter_connectivityসংযোগের পরিবর্তনের জন্য অনুসন্ধান করে এবং তারপরে নেটওয়ার্ক সংযোগ পরীক্ষা করে, তারপরে StreamControllerযত্নশীল যে কোনও কিছু আপডেট করার জন্য একটি ব্যবহার করে ।

দেখে মনে হচ্ছে:

import 'dart:io'; //InternetAddress utility
import 'dart:async'; //For StreamController/Stream

import 'package:connectivity/connectivity.dart';

class ConnectionStatusSingleton {
    //This creates the single instance by calling the `_internal` constructor specified below
    static final ConnectionStatusSingleton _singleton = new ConnectionStatusSingleton._internal();
    ConnectionStatusSingleton._internal();

    //This is what's used to retrieve the instance through the app
    static ConnectionStatusSingleton getInstance() => _singleton;

    //This tracks the current connection status
    bool hasConnection = false;

    //This is how we'll allow subscribing to connection changes
    StreamController connectionChangeController = new StreamController.broadcast();

    //flutter_connectivity
    final Connectivity _connectivity = Connectivity();

    //Hook into flutter_connectivity's Stream to listen for changes
    //And check the connection status out of the gate
    void initialize() {
        _connectivity.onConnectivityChanged.listen(_connectionChange);
        checkConnection();
    }

    Stream get connectionChange => connectionChangeController.stream;

    //A clean up method to close our StreamController
    //   Because this is meant to exist through the entire application life cycle this isn't
    //   really an issue
    void dispose() {
        connectionChangeController.close();
    }

    //flutter_connectivity's listener
    void _connectionChange(ConnectivityResult result) {
        checkConnection();
    }

    //The test to actually see if there is a connection
    Future<bool> checkConnection() async {
        bool previousConnection = hasConnection;

        try {
            final result = await InternetAddress.lookup('google.com');
            if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
                hasConnection = true;
            } else {
                hasConnection = false;
            }
        } on SocketException catch(_) {
            hasConnection = false;
        }

        //The connection status changed send out an update to all listeners
        if (previousConnection != hasConnection) {
            connectionChangeController.add(hasConnection);
        }

        return hasConnection;
    }
}

ব্যবহার

আরম্ভ

প্রথমে আমাদের নিশ্চিত করতে হবে যে আমরা আমাদের সিঙ্গলটনের সূচনা বলি। তবে শুধুমাত্র একবার। এই অংশগুলি আপনার উপর নির্ভর করে তবে আমি এটি আমার অ্যাপ্লিকেশনটিতে করেছি main():

void main() {
    ConnectionStatusSingleton connectionStatus = ConnectionStatusSingleton.getInstance();
    connectionStatus.initialize();

    runApp(MyApp());

    //Call this if initialization is occuring in a scope that will end during app lifecycle
    //connectionStatus.dispose();   
}

ইন Widgetবা অন্যত্র

import 'dart:async'; //For StreamSubscription

...

class MyWidgetState extends State<MyWidget> {
    StreamSubscription _connectionChangeStream;

    bool isOffline = false;

    @override
    initState() {
        super.initState();

        ConnectionStatusSingleton connectionStatus = ConnectionStatusSingleton.getInstance();
        _connectionChangeStream = connectionStatus.connectionChange.listen(connectionChanged);
    }

    void connectionChanged(dynamic hasConnection) {
        setState(() {
            isOffline = !hasConnection;
        });
    }

    @override
    Widget build(BuildContext ctxt) {
        ...
    }
}

আশা করি অন্য কেউ এটি দরকারী বলে মনে করেন!


গিথুব রেপোর উদাহরণ: https://github.com/dennmat/flutter-connectiontest-example

ফলটি দেখতে এমুলেটরটিতে বিমান মোড টগল করুন


4
কোডটি পরীক্ষা করেছেন এবং এটি আমার জন্য কাজ করছে আমার সাহায্য করার জন্য আরও তথ্যের প্রয়োজন need
dennmat

4
আহ, ঠিক আছে আমি এটা দেখতে। সুতরাং আপনার ভবিষ্যতের রেফারেন্সের জন্য আপনি যে ত্রুটি পোস্ট করছেন সেটি হ'ল সম্পাদকটি ফাইলটি খোলার চেষ্টা করছেন যেখানে মনে হয় ত্রুটিটি ঘটেছে। আসল ত্রুটিটি আপনার সম্পাদকদের ডিবাগ কনসোল / স্ট্যাক ট্রেস প্যানেলে পাওয়া উচিত। সুতরাং আমি অনুমান করি রানঅ্যাপের রিটার্নগুলি আমি ধরে নিয়েছি এটি প্রোগ্রামের পুরো জীবনের জন্য চলবে। এটি মূলতে যেমন নিষ্পত্তি হয় তা এখানে দেখার জন্য প্রয়োজনীয় নয় তাই কেবল উপরের মত connectionStatus.dispose()এটি সেট করে রেখে ধরেই মুছে ফেলুন main()। গিথুব উদাহরণের সাথে পোস্ট এবং লিঙ্ক আপডেট করবে।
ডেন্ম্যাট

4
ওয়াইফাই বা সেলুলারটি স্যুইচ করা হচ্ছে কিনা তা সনাক্ত করতে আপনার কেবল ফ্লটার সংযোগ প্রয়োজন। এই মোড়কটি সুইচটি হওয়ার পরে সংযোগটি পরীক্ষা করে। তবে প্রতিটি নেটওয়ার্ক পরিবর্তনকে সতর্ক করবে না। আপনি যদি এমুলেটরটি টগলিং এয়ারপ্লেন মোড ব্যবহার করেন তবে ইন্টারনেট সংযোগ হারানোর সহজ উপায়। আপনি যদি কোনও আসল ডিভাইসে থাকেন তবে আপনাকে নিশ্চিত করতে হবে যে আপনি এখনও ডেটা সহ কোনও মোবাইল নেটওয়ার্কের সাথে সংযুক্ত ছিলেন না।
ডেনমেট

4
এর জন্য কয়েকটি বিকল্প রয়েছে, আপনি ঘন ঘন পরীক্ষার জন্য টাইমার ব্যবহার করতে উপরেরটি সংশোধন করতে পারেন। অথবা টাইমার ইউটিলিটি ব্যবহার করে ঘন ঘন পরীক্ষা করুন। দেখুন: api.dartlang.org/stable/2.1.0/dart-async/Timer-class.html অন্য বিকল্প আপনি প্রেরণ প্রতিটি অনুরোধের আগে সংযোগটি পরীক্ষা করছে। যদিও মনে হচ্ছে আপনি ওয়েবসকেটের মতো কিছু খুঁজছেন। যাইহোক শুভকামনা
dennmat

4
উইজেটের নিষ্পত্তি () ফাংশনে কি সাবস্ক্রিপশনটি বাতিল করা উচিত নয়? আমি এখানে অন্যান্য স্ট্রিমকন্ট্রোলার উদাহরণগুলিতে এটি দেখতে পেয়েছি: স্ট্যাকওভারফ্লো
ওরেেন

41

এখানে চিত্র বর্ণনা লিখুন

ইন্টারনেট সংযোগ এবং এর উত্সের শ্রোতা প্রদর্শনের পুরো উদাহরণ।

ক্রেডিট: সংযোগ এবং গন্টার জ্যাচবাউয়ার

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

void main() => runApp(MaterialApp(home: HomePage()));

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  Map _source = {ConnectivityResult.none: false};
  MyConnectivity _connectivity = MyConnectivity.instance;

  @override
  void initState() {
    super.initState();
    _connectivity.initialise();
    _connectivity.myStream.listen((source) {
      setState(() => _source = source);
    });
  }

  @override
  Widget build(BuildContext context) {
    String string;
    switch (_source.keys.toList()[0]) {
      case ConnectivityResult.none:
        string = "Offline";
        break;
      case ConnectivityResult.mobile:
        string = "Mobile: Online";
        break;
      case ConnectivityResult.wifi:
        string = "WiFi: Online";
    }

    return Scaffold(
      appBar: AppBar(title: Text("Internet")),
      body: Center(child: Text("$string", style: TextStyle(fontSize: 36))),
    );
  }

  @override
  void dispose() {
    _connectivity.disposeStream();
    super.dispose();
  }
}

class MyConnectivity {
  MyConnectivity._internal();

  static final MyConnectivity _instance = MyConnectivity._internal();

  static MyConnectivity get instance => _instance;

  Connectivity connectivity = Connectivity();

  StreamController controller = StreamController.broadcast();

  Stream get myStream => controller.stream;

  void initialise() async {
    ConnectivityResult result = await connectivity.checkConnectivity();
    _checkStatus(result);
    connectivity.onConnectivityChanged.listen((result) {
      _checkStatus(result);
    });
  }

  void _checkStatus(ConnectivityResult result) async {
    bool isOnline = false;
    try {
      final result = await InternetAddress.lookup('example.com');
      if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
        isOnline = true;
      } else
        isOnline = false;
    } on SocketException catch (_) {
      isOnline = false;
    }
    controller.sink.add({result: isOnline});
  }

  void disposeStream() => controller.close();
}

ফায়ারবেস, এসডিকে দিয়ে কি সম্ভব?
LOG_TAG

@ LOG_TAG এর জন্য আপনাকে ফায়ারবেস ব্যবহার করতে হবে না।
CopsOnRoad

4
@CopsOnRoad আপনাকে অনেক ধন্যবাদ তুমি আমার সময় বাঁচিয়েছ
নিমিশা রানিপা

মানচিত্র _সোর্স = {কানেক্টিভিটিআরসাল্ট.নোন: মিথ্যা}; আপনি এখানে কেন "মিথ্যা" ব্যবহার করেছেন
ফারুক এআইডিন

@ কপসঅনরোড ধন্যবাদ! আমি এই পদ্ধতিটি ব্যবহার করেছি, তবে এই পদ্ধতিটি আমাকে প্রথমবার NoInternetConnication দেয়! কেন আগে আমাকে কিছুই দিবে না? এটি আমার ডিবাগ প্রিন্ট: কানেক্টিভিটিআরসাল্ট.নোন কানেক্টিভিটিআরসাল্ট.উইফাই কানেক্টিভিটিআরসালট.উইফাই।
ফারুক আইডিন

23

আমি দেখতে পেয়েছি যে কেবল সংযোগটি ব্যবহার করছি প্যাকেজটি ইন্টারনেট উপলব্ধ ছিল কিনা তা জানার জন্য যথেষ্ট ছিল না। অ্যান্ড্রয়েডে এটি কেবলমাত্র ওয়াইফাই আছে কিনা বা মোবাইল ডেটা চালু থাকলে তা পরীক্ষা করে না, এটি একটি আসল ইন্টারনেট সংযোগের জন্য পরীক্ষা করে না। আমার পরীক্ষার সময়, এমনকি কোনও মোবাইল সিগন্যাল না থাকলেও সংযোগের পুনরায় ফলাফল.মোবাইল সত্য হয়ে উঠবে।

আইওএসের সাহায্যে আমার পরীক্ষায় দেখা গেছে যে ফোনের কোনও সংকেত না থাকলে কোনও ইন্টারনেট সংযোগ রয়েছে কিনা তা সংযোগ প্লাগইনটি সঠিকভাবে সনাক্ত করে।

আমি যে সমাধানটি পেয়েছি তা হ'ল সংযোগ প্যাকেজ সহ ডেটা_সংযোগ_চেকার প্যাকেজটি ব্যবহার করা । এটি কেবলমাত্র কয়েকটি নির্ভরযোগ্য ঠিকানায় অনুরোধ করে একটি ইন্টারনেট সংযোগ রয়েছে তা নিশ্চিত করে, চেকটির ডিফল্ট সময়সীমা প্রায় 10 সেকেন্ডের।

আমার সমাপ্তি ইন্টার্নেট ফাংশনটি দেখতে কিছুটা এরকম দেখাচ্ছে:

  Future<bool> isInternet() async {
    var connectivityResult = await (Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.mobile) {
      // I am connected to a mobile network, make sure there is actually a net connection.
      if (await DataConnectionChecker().hasConnection) {
        // Mobile data detected & internet connection confirmed.
        return true;
      } else {
        // Mobile data detected but no internet connection found.
        return false;
      }
    } else if (connectivityResult == ConnectivityResult.wifi) {
      // I am connected to a WIFI network, make sure there is actually a net connection.
      if (await DataConnectionChecker().hasConnection) {
        // Wifi detected & internet connection confirmed.
        return true;
      } else {
        // Wifi detected but no internet connection found.
        return false;
      }
    } else {
      // Neither mobile data or WIFI detected, not internet connection found.
      return false;
    }
  }

if (await DataConnectionChecker().hasConnection)অংশ উভয় মোবাইল এবং ওয়াইফাই সংযোগ জন্য একই এবং সম্ভবত একটি পৃথক ফাংশন সরানো হবে। আমি এটিকে এখানে আরও পাঠযোগ্য রাখার জন্য করি নি।

এটি আমার প্রথম স্ট্যাক ওভারফ্লো উত্তর, আশা করি এটি কাউকে সহায়তা করবে।


4
স্ট্যাকওভারফ্লোতে স্বাগতম। শুধু ভাবছি, await DataConnectionChecker().hasConnectionপ্রথম স্থানে ব্যবহার করে কী লাভ?
হারবার্ট

4
এর একমাত্র কারণ আইওএসে সংযোগ প্যাকেজটি তাত্ক্ষণিকভাবে বলতে পারে যে কোনও সংযোগ নেই। যদি আমি স্রেফ ডেটা_সংযোগ_চেকার প্যাকেজটি ব্যবহার করি তবে আইওএস-এ অ্যাপ্লিকেশনটিকে মিথ্যা প্রত্যাবর্তনের আগে, 10 সেকেন্ডের মধ্যে, http অনুরোধটির সময়সীমা শেষ হওয়া পর্যন্ত অপেক্ষা করতে হবে। যদিও এটি কিছু ক্ষেত্রে গ্রহণযোগ্য হতে পারে। আপনি ওয়াইফাই বা মোবাইল ডেটা ব্যবহার করছেন যা আমার এখানে জানা দরকার না তবে এটি জেনে রাখা কার্যকর হতে পারে তাও সংযোগ প্যাকেজটি বলতে পারে।
abernee

এটি উপরের কোডটিতে কয়েকটি সিনট্যাক্স পরিবর্তন সহ পুরোপুরি কাজ করে works 1. আপনার ফিউচার <বুুল> কে ভবিষ্যতে <বিউল>) এ পরিবর্তন করা দরকার, কারণ প্রকারগুলি ছোট হাতের। ২ র্থ সর্বশেষ রিটার্ন স্টেটমেন্টের জন্য সেমিকোলন (;) যুক্ত করুন।
টিডিএম

ধন্যবাদ টিডিএম, আমি আপনার পরিবর্তনগুলি দিয়ে উত্তরটি সম্পাদনা করেছি।
abernee

20

ব্যবহার

dependencies:
  connectivity: ^0.4.2

আমরা কি রিসোস থেকে পেয়েছি তা

      import 'package:connectivity/connectivity.dart';

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

ভবিষ্যত আমার পক্ষে সামান্য সমস্যাযুক্ত, আমাদের প্রতিবারের মতো এটি প্রয়োগ করতে হবে:

check().then((intenet) {
      if (intenet != null && intenet) {
        // Internet Present Case
      }
      // No-Internet Case
    });

সুতরাং এই সমস্যাটি সমাধান করার জন্য আমি একটি ক্লাস তৈরি করেছি যা বুলিয়ান সাথে একটি ফাংশন গ্রহণ করে নেট নেটওয়ার্কপ্রেসেট প্যারামিটার

methodName(bool isNetworkPresent){}

এবং ইউটিলিটি ক্লাস হয়

import 'package:connectivity/connectivity.dart';

class NetworkCheck {
  Future<bool> check() async {
    var connectivityResult = await (Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.mobile) {
      return true;
    } else if (connectivityResult == ConnectivityResult.wifi) {
      return true;
    }
    return false;
  }

  dynamic checkInternet(Function func) {
    check().then((intenet) {
      if (intenet != null && intenet) {
        func(true);
      }
      else{
    func(false);
  }
    });
  }
}

এবং সংযোগ-চেক ইউটিলিটি ব্যবহার করতে

  fetchPrefrence(bool isNetworkPresent) {
    if(isNetworkPresent){

    }else{

    }
  }

আমি এই বাক্য গঠন ব্যবহার করব

NetworkCheck networkCheck = new NetworkCheck();
networkCheck.checkInternet(fetchPrefrence)

6

আমি একটি প্যাকেজ তৈরি করেছি যা (আমি মনে করি) এই সমস্যাটির সাথে নির্ভরযোগ্যভাবে ডিল করে।

পাব.দেব প্যাকেজ

গিটহাবের প্যাকেজ

আলোচনা খুব স্বাগত। আপনি গিটহাব এ ইস্যু ট্র্যাকার ব্যবহার করতে পারেন।


আমি আর এটি নীচে একটি নির্ভরযোগ্য পদ্ধতি বলে মনে করি না:


@ ওরেইনে কিছু যোগ করতে চান উত্তরে : আপনার সত্যিকার অর্থে আরও একটি ক্যাচ যুক্ত করা উচিত যা অন্য সমস্ত ব্যতিক্রম (কেবল নিরাপদ থাকায়) ধরবে, বা কেবল ব্যতিক্রম সম্পূর্ণরূপে সরিয়ে ফেলবে এবং একটি ব্যতিক্রম যা সমস্ত ব্যতিক্রম নিয়ে কাজ করে তা ব্যবহার করবে:

মামলা 1:

try {
  await Firestore.instance
    .runTransaction((Transaction tx) {})
    .timeout(Duration(seconds: 5));
  hasConnection = true;
} on PlatformException catch(_) { // May be thrown on Airplane mode
  hasConnection = false;
} on TimeoutException catch(_) {
  hasConnection = false;
} catch (_) {
  hasConnection = false;
}

বা এমনকি সহজ ...

কেস 2:


try {
  await Firestore.instance
    .runTransaction((Transaction tx) {})
    .timeout(Duration(seconds: 5));
  hasConnection = true;
} catch (_) {
  hasConnection = false;
}

5

আমি উইজেট রাজ্যের জন্য একটি বেস শ্রেণি তৈরি করেছি

ব্যবহারের পরিবর্তে State<LoginPage>ব্যবহারের BaseState<LoginPage> পরে কেবলমাত্র বুলিয়ান ভেরিয়েবলটি অনলাইনে ব্যবহার করুন

Text(isOnline ? 'is Online' : 'is Offline')

প্রথমে সংযোগ প্লাগইন যুক্ত করুন:

dependencies:
  connectivity: ^0.4.3+2

তারপরে বেসস্টেট ক্লাস যুক্ত করুন

import 'dart:async';
import 'dart:io';
import 'package:flutter/services.dart';

import 'package:connectivity/connectivity.dart';
import 'package:flutter/widgets.dart';

/// a base class for any statful widget for checking internet connectivity
abstract class BaseState<T extends StatefulWidget> extends State {

  void castStatefulWidget();

  final Connectivity _connectivity = Connectivity();

  StreamSubscription<ConnectivityResult> _connectivitySubscription;

  /// the internet connectivity status
  bool isOnline = true;

  /// initialize connectivity checking
  /// Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initConnectivity() async {
    // Platform messages may fail, so we use a try/catch PlatformException.
    try {
      await _connectivity.checkConnectivity();
    } on PlatformException catch (e) {
      print(e.toString());
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) {
      return;
    }

    await _updateConnectionStatus().then((bool isConnected) => setState(() {
          isOnline = isConnected;
        }));
  }

  @override
  void initState() {
    super.initState();
    initConnectivity();
    _connectivitySubscription = Connectivity()
        .onConnectivityChanged
        .listen((ConnectivityResult result) async {
      await _updateConnectionStatus().then((bool isConnected) => setState(() {
            isOnline = isConnected;
          }));
    });
  }

  @override
  void dispose() {
    _connectivitySubscription.cancel();
    super.dispose();
  }

  Future<bool> _updateConnectionStatus() async {
    bool isConnected;
    try {
      final List<InternetAddress> result =
          await InternetAddress.lookup('google.com');
      if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
        isConnected = true;
      }
    } on SocketException catch (_) {
      isConnected = false;
      return false;
    }
    return isConnected;
  }
}

এবং আপনার নিজের উইজেটটি এইভাবে আপনার কাস্ট করতে হবে

@override
  void castStatefulWidget() {
    // ignore: unnecessary_statements
    widget is StudentBoardingPage;
  }

4
আমি এই ক্লাসটি কীভাবে ব্যবহার করতে পারি?
ডলডর্মমা

@ ডলডার্মা কেবল এটি যুক্ত করুন এবং এটিকে আমদানি করুন তারপরে স্টেটের পরিবর্তে <লোগিনপেজ> বেসস্টেট ব্যবহার করুন <লোগিনপেজ> তারপরে কেবল বুলিয়ান ভেরিয়েবলটি অনলাইনে ব্যবহার করুন
amorenew

এই কোডটি দিয়ে আমি মূল্যবানগুলি পেতে পারি না widget। উদাহরণস্বরূপ: RegisterBloc get _registerBloc => widget.registerBloc;আমি error: The getter 'registerBloc' isn't defined for the class 'StatefulWidget'. (undefined_getter at lib\screens\fragmemt_register\view\register_mobile_number.dart:29)এই বাস্তবায়নটি দেখতে এই ত্রুটিটি পেয়েছি:class _FragmentRegisterMobileNumberState extends BaseState<FragmentRegisterMobileNumber> with SingleTickerProviderStateMixin { RegisterBloc get _registerBloc => widget.registerBloc;
ডলডর্মমা

@ ডলডুরমা আমি গিটহাবের নমুনা ব্যতীত সমস্যাটি সম্পর্কে নিশ্চিত নই কারণ এই তথ্যটি যথেষ্ট নয়
amorenew

4
দয়া করে এই রেপোটি পরীক্ষা করে দেখুন এবং আমি কীভাবে is_onlineকনসোল github.com/MahdiPishguy/flutter-conecectivity-sample
ডলডর্মমা 28:59

3

@ এডনমেটের উত্তর অনুসরণ করে আমি লক্ষ্য করেছি যে InternetAddress.lookupইন্টারনেট সংযোগ বন্ধ থাকলেও সফল ফলাফলগুলি আসতে পারে - আমি আমার সিমুলেটর থেকে আমার বাড়ির ওয়াইফাইয়ের সাথে সংযোগ স্থাপন করে এবং তারপরে আমার রাউটারের কেবলটি সংযোগ বিচ্ছিন্ন করে পরীক্ষা করেছি। আমি মনে করি কারণটি হ'ল রাউটারটি ডোমেন-অনুসন্ধানের ফলাফলগুলিকে ক্যাশে করে তাই এটি প্রতিটি দেখার অনুরোধে ডিএনএস সার্ভারগুলিকে জিজ্ঞাসা করতে হবে না।

যাইহোক, আপনি যদি আমার মতো ফায়ার স্টোর ব্যবহার করেন তবে আপনি ট্র্যাক-সকেটএক্সেপশন-ক্যাচ ব্লকটিকে একটি খালি লেনদেনের সাথে প্রতিস্থাপন করতে পারেন এবং টাইমআউটএক্সেপশন ধরতে পারেন:

try {
  await Firestore.instance.runTransaction((Transaction tx) {}).timeout(Duration(seconds: 5));
  hasConnection = true;
} on PlatformException catch(_) { // May be thrown on Airplane mode
  hasConnection = false;
} on TimeoutException catch(_) {
  hasConnection = false;
}

এছাড়াও, দয়া করে নোট করুন যেটি previousConnectionasync ইনেট-চেকের আগে সেট করা আছে, তাই তাত্ত্বিকভাবে যদি checkConnection()অল্প সময়ের মধ্যে একাধিকবার বলা hasConnection=trueহয় তবে এক সারিতে একাধিক বা একাধিক সারিতে থাকতে পারে hasConnection=false। আমি নিশ্চিত না যে @ এডনমেট এটি উদ্দেশ্যমূলকভাবে করেছে বা না, তবে আমাদের ব্যবহারের ক্ষেত্রে কোনও পার্শ্ব প্রতিক্রিয়া ছিল না ( setStateকেবল একই মান দিয়ে দু'বার বলা হয়েছিল)।


3

সংযোগ: প্যাকেজটি প্রকৃত ইন্টারনেট সংযোগের নিশ্চয়তা দেয় না (ইন্টারনেট অ্যাক্সেস ছাড়া কেবল ওয়াইফাই সংযোগ হতে পারে)।

ডকুমেন্টেশন থেকে উদ্ধৃতি:

নোট করুন যে অ্যান্ড্রয়েডে, এটি ইন্টারনেটের সাথে সংযোগের নিশ্চয়তা দেয় না। উদাহরণস্বরূপ, অ্যাপটিতে ওয়াইফাই অ্যাক্সেস থাকতে পারে তবে এটি কোনও ভিপিএন বা কোনও অ্যাক্সেস ছাড়াই একটি হোটেল ওয়াইফাই হতে পারে।

আপনার যদি সত্যিই www ইন্টারনেটের সাথে সংযোগটি পরীক্ষা করতে হয় তবে আরও ভাল পছন্দ হবে

ডেটা_সংযোগ_চেকার প্যাকেজ


1

এখানে আমার সলিউশন এটি ইন্টারনেট সংযোগের পাশাপাশি ডেটা সংযোগও পরীক্ষা করে নেবে আশা করি আপনি এটি পছন্দ করেছেন।

সবার আগে আপনার pubsec.yaml এ নির্ভরতা যুক্ত করুন
dependencies:        
    data_connection_checker:
এবং এখানে আমার সমাধানের মূল.ডার্ট d
import 'dart:async';

import 'package:data_connection_checker/data_connection_checker.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Data Connection Checker",
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  StreamSubscription<DataConnectionStatus> listener;

  var Internetstatus = "Unknown";

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
//    _updateConnectionStatus();
      CheckInternet();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    listener.cancel();
    super.dispose();
  }

  CheckInternet() async {
    // Simple check to see if we have internet
    print("The statement 'this machine is connected to the Internet' is: ");
    print(await DataConnectionChecker().hasConnection);
    // returns a bool

    // We can also get an enum instead of a bool
    print("Current status: ${await DataConnectionChecker().connectionStatus}");
    // prints either DataConnectionStatus.connected
    // or DataConnectionStatus.disconnected

    // This returns the last results from the last call
    // to either hasConnection or connectionStatus
    print("Last results: ${DataConnectionChecker().lastTryResults}");

    // actively listen for status updates
    listener = DataConnectionChecker().onStatusChange.listen((status) {
      switch (status) {
        case DataConnectionStatus.connected:
          Internetstatus="Connectd TO THe Internet";
          print('Data connection is available.');
          setState(() {

          });
          break;
        case DataConnectionStatus.disconnected:
          Internetstatus="No Data Connection";
          print('You are disconnected from the internet.');
          setState(() {

          });
          break;
      }
    });

    // close listener after 30 seconds, so the program doesn't run forever
//    await Future.delayed(Duration(seconds: 30));
//    await listener.cancel();
    return await await DataConnectionChecker().connectionStatus;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Data Connection Checker"),
      ),
      body: Container(
        child: Center(
          child: Text("$Internetstatus"),
        ),
      ),
    );
  }
}

1

প্রস্তাবিত সমাধানগুলির সাথে আমার একটি সমস্যা ছিল, ব্যবহারটি lookupসর্বদা প্রত্যাশিত মানটি ফেরায় না।

এটি ডিএনএস ক্যাশিংয়ের কারণে, কলটির মানটি ক্যাশ করা হয় এবং পরের বার চেষ্টা করে সঠিক কল করার ইন্টেড এটি ক্যাশেড মানটি দেয়। অবশ্যই এটি এখানে একটি ইস্যু হিসাবে এর অর্থ এটি যদি আপনি সংযোগ হারাতে এবং কল করে lookupএটি আপনার কাছে থাকা ক্যাশেড মানটি আবারও ফিরিয়ে দিতে পারে যেমন আপনার ইন্টারনেট রয়েছে এবং বিপরীতে, যদি আপনি lookupফিরে এসে শূন্যের পরে আপনার ইন্টারনেট পুনরায় সংযোগ করেন তবে এটি এখনও সময়কালের জন্য বাতিল হয়ে যাবে ক্যাশে, যা আপনার কাছে এখন ইন্টারনেট থাকলেও কয়েক মিনিট সময় নিতে পারে।

টিএল; ডিআর: lookupকোনও কিছু ফিরিয়ে দেওয়ার অর্থ এই নয় যে আপনার কাছে ইন্টারনেট রয়েছে এবং এটি কোনও কিছু না ফিরিয়ে দেওয়ার অর্থ এই নয় যে আপনার কাছে ইন্টারনেট নেই। এটি নির্ভরযোগ্য নয়।

আমি data_connection_checkerপ্লাগইন থেকে অনুপ্রেরণা নিয়ে নিম্নলিখিত সমাধানটি প্রয়োগ করেছি :

 /// If any of the pings returns true then you have internet (for sure). If none do, you probably don't.
  Future<bool> _checkInternetAccess() {
    /// We use a mix of IPV4 and IPV6 here in case some networks only accept one of the types.
    /// Only tested with an IPV4 only network so far (I don't have access to an IPV6 network).
    final List<InternetAddress> dnss = [
      InternetAddress('8.8.8.8', type: InternetAddressType.IPv4), // Google
      InternetAddress('2001:4860:4860::8888', type: InternetAddressType.IPv6), // Google
      InternetAddress('1.1.1.1', type: InternetAddressType.IPv4), // CloudFlare
      InternetAddress('2606:4700:4700::1111', type: InternetAddressType.IPv6), // CloudFlare
      InternetAddress('208.67.222.222', type: InternetAddressType.IPv4), // OpenDNS
      InternetAddress('2620:0:ccc::2', type: InternetAddressType.IPv6), // OpenDNS
      InternetAddress('180.76.76.76', type: InternetAddressType.IPv4), // Baidu
      InternetAddress('2400:da00::6666', type: InternetAddressType.IPv6), // Baidu
    ];

    final Completer<bool> completer = Completer<bool>();

    int callsReturned = 0;
    void onCallReturned(bool isAlive) {
      if (completer.isCompleted) return;

      if (isAlive) {
        completer.complete(true);
      } else {
        callsReturned++;
        if (callsReturned >= dnss.length) {
          completer.complete(false);
        }
      }
    }

    dnss.forEach((dns) => _pingDns(dns).then(onCallReturned));

    return completer.future;
  }

  Future<bool> _pingDns(InternetAddress dnsAddress) async {
    const int dnsPort = 53;
    const Duration timeout = Duration(seconds: 3);

    Socket socket;
    try {
      socket = await Socket.connect(dnsAddress, dnsPort, timeout: timeout);
      socket?.destroy();
      return true;
    } on SocketException {
      socket?.destroy();
    }
    return false;
  }

কলটি সম্পূর্ণ _checkInternetAccessহতে সর্বোচ্চ সময়কাল নেয় timeout(এখানে 3 সেকেন্ড), এবং আমরা যদি ডিএনএসের কোনওটিতে পৌঁছতে পারি তবে এটি অন্যটির জন্য অপেক্ষা না করেই প্রথমটি পৌঁছানোর সাথে সাথেই এটি সম্পূর্ণ হয়ে যায় (যতক্ষণ না একজনের কাছে পৌঁছানো যথেষ্ট) জেনে নিন আপনার কাছে ইন্টারনেট আছে)। সমস্ত কল _pingDnsসমান্তরালভাবে করা হয়।

এটি একটি আইপিভি 4 নেটওয়ার্কে ভাল কাজ করছে বলে মনে হচ্ছে এবং যখন আমি এটি কোনও আইপিভি 6 নেটওয়ার্কে পরীক্ষা করতে পারি না (আমার একটিতে অ্যাক্সেস নেই) আমি মনে করি এটি এখনও কাজ করা উচিত। এটি রিলিজ মোড বিল্ডগুলিতেও কাজ করে, তবে তারা এখনও এই সমাধান সহ কোনও সমস্যা খুঁজে পান কিনা তা জানতে আমার অ্যাপ্লিকেশনটি অ্যাপলের কাছে জমা দিতে হয়েছিল।

এটি বেশিরভাগ দেশগুলিতেও (চীন সহ) কাজ করা উচিত, যদি এটি একটিতে কাজ না করে তবে আপনি আপনার লক্ষ্যযুক্ত দেশ থেকে অ্যাক্সেসযোগ্য তালিকায় একটি ডিএনএস যুক্ত করতে পারেন।


1

আমি শেষ পর্যন্ত ( যদিও অনিচ্ছুকভাবে ) এই প্রশ্নের পূর্ববর্তী উত্তরে @ বার্নির প্রদত্ত সমাধানটিতে স্থির হয়েছি । আমি সবসময় চেষ্টা করি এবং যতটা সম্ভব আমার প্রকল্পগুলিতে কয়েকটি বাহ্যিক প্যাকেজ ব্যবহার করি - আমি জানি যে আমি যে সফ্টওয়্যারটি তৈরি করি তাতে কেবলমাত্র বাহ্যিক প্যাকেজই ব্যর্থতার একমাত্র [সম্ভাব্য] পয়েন্ট। সুতরাং কেবলমাত্র সাধারণ বাস্তবায়নের জন্য TWO বাহ্যিক প্যাকেজগুলিতে লিঙ্ক করা আমার পক্ষে সহজ ছিল না

তবুও, আমি অবর্ণির কোডটি নিয়েছি এবং এটিকে আরও দুর্বল এবং আরও বুদ্ধিমান করার জন্য এটি সংশোধন করেছি। বুদ্ধিমানের দ্বারা আমি বোঝাতে চাইছি তিনি তার ফাংশনে সংযোগ প্যাকেজটির শক্তি গ্রাস করেন তবে তারপরে এই প্যাকেজটি (অর্থাৎ নেটওয়ার্ক সনাক্তকরণ) থেকে সর্বাধিক মূল্যবান আউটপুটগুলি না ফিরিয়ে অভ্যন্তরীণভাবে এটি নষ্ট করে দেয়। সুতরাং এখানে আবর্ণির সমাধানের পরিবর্তিত সংস্করণটি রয়েছে:

import 'package:connectivity/connectivity.dart';
import 'package:data_connection_checker/data_connection_checker.dart';


// 'McGyver' - the ultimate cool guy (the best helper class any app can ask for).
class McGyver {

  static Future<Map<String, dynamic>> checkInternetAccess() async {
    //* ////////////////////////////////////////////////////////////////////////////////////////// *//
    //*   INFO: ONLY TWO return TYPES for Map 'dynamic' value => <bool> and <ConnectivityResult>   *//
    //* ////////////////////////////////////////////////////////////////////////////////////////// *//
    Map<String, dynamic> mapCon;
    final String isConn = 'isConnected', netType = 'networkType';
    ConnectivityResult conRes = await (Connectivity().checkConnectivity());
    switch (conRes) {
      case ConnectivityResult.wifi:   //* WiFi Network: true !!
        if (await DataConnectionChecker().hasConnection) {   //* Internet Access: true !!
          mapCon = Map.unmodifiable({isConn: true, netType: ConnectivityResult.wifi});
        } else {
          mapCon = Map.unmodifiable({isConn: false, netType: ConnectivityResult.wifi});
        }
        break;
      case ConnectivityResult.mobile:   //* Mobile Network: true !!
        if (await DataConnectionChecker().hasConnection) {   //* Internet Access: true !!
          mapCon = Map.unmodifiable({isConn: true, netType: ConnectivityResult.mobile});
        } else {
          mapCon = Map.unmodifiable({isConn: false, netType: ConnectivityResult.mobile});
        }
        break;
      case ConnectivityResult.none:   //* No Network: true !!
        mapCon = Map.unmodifiable({isConn: false, netType: ConnectivityResult.none});
        break;
    }
    return mapCon;
  }

}

তারপরে আপনি নীচের মতো আপনার কোডের যে কোনও জায়গা থেকে একটি সাধারণ কলের মাধ্যমে এই স্থির ফাংশনটি ব্যবহার করবেন:

bool isConn; ConnectivityResult netType;
McGyver.checkInternetAccess().then(
  (mapCIA) {  //* 'mapCIA' == amalgamation for 'map' from 'CheckInternetAccess' function result.
    debugPrint("'mapCIA' Keys: ${mapCIA.keys}");
    isConn = mapCIA['isConnected'];
    netType = mapCIA['networkType'];
  }
);
debugPrint("Internet Access: $isConn   |   Network Type: $netType");

এটি আপনার জন্য অত্যন্ত দুঃখের বিষয় যে আপনার উদ্বিগ্ন প্রকল্পে এটি খুব বেসিক কার্যকারিতা পেতে আপনাকে দুটি বহিরাগত প্যাকেজগুলির সাথে লিঙ্ক করতে হবে - তবে আমার ধারণা এখন আমাদের কাছে এটিই সেরা। আমি আসলে পছন্দ করা ডেটা সংযোগ যাচাইকারী উপর প্যাকেজ কানেক্টিভিটি প্যাকেজ - কিন্তু (এই পোস্ট করার সময়) সাবেক যে খুবই গুরুত্বপূর্ণ অনুপস্থিত ছিল নেটওয়ার্কের সনাক্তকরণ বৈশিষ্ট্য যে আমি কানেক্টিভিটি প্যাকেজ থেকে প্রয়োজন হয়। এই কারণেই আমি এই পদ্ধতির উপর [অস্থায়ীভাবে] খেলাপি হয়েছি।


0

কেবল কোডটি ব্যবহার করে সরল করার চেষ্টা করছি স্পন্দনে কানেক্টিভিটি প্যাকেজ ।

import 'package:connectivity/connectivity.dart';

var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.mobile) {
  // I am connected to a mobile network.
} else if (connectivityResult == ConnectivityResult.wifi) {
  // I am connected to a wifi network.
} else {
  // I am not connected to the internet
}

অ্যান্ড্রয়েডে যদিও এটি হ'ল সমস্যাটি হ'ল কেবল আপনি ওয়াইফাই বা মোবাইলের মাধ্যমে সংযুক্ত থাকছেন, এর অর্থ এই নয় যে আপনি ইন্টারনেটের সাথে সংযুক্ত রয়েছেন।
মেগাডেক

4
@ মেগাডেক দুঃখজনকভাবে হ্যাঁ একমাত্র সমস্যাটিই
বোঝায়

0

দেরিতে উত্তর, কিন্তু পরীক্ষা করতে এই প্যাকেজটি ব্যবহার করুন। প্যাকেজের নাম: ডেটা_সংযোগ_চেকার

আপনার মধ্যে pubspec.yuml ফাইল:

dependencies:
    data_connection_checker: ^0.3.4

কানেকশন.ডার্ট নামে একটি ফাইল তৈরি করুন বা যে কোনও নাম আপনি চান। প্যাকেজ আমদানি করুন:

import 'package:data_connection_checker/data_connection_checker.dart';

ইন্টারনেট সংযোগ আছে কিনা তা পরীক্ষা করুন:

print(await DataConnectionChecker().hasConnection);

0

আমি ওয়াইফাই বা মোবাইলের সাথে সংযোগ উপলব্ধ থাকলেও ইন্টারনেট অ্যাক্সেস পরীক্ষা করতে ডেটা_সংযোগ_চেকার প্যাকেজটি ব্যবহার করেছি, এটি ভালভাবে কাজ করে: সংযোগটি পরীক্ষা করার কোডটি এখানে:

bool result = await DataConnectionChecker().hasConnection;
if(result == true) {
   print('YAY! Free cute dog pics!');
} else {
   print('No internet :( Reason:');
   print(DataConnectionChecker().lastTryResults);
}

আপনি আরও তথ্য চান প্যাকেজ মাথা। ডেটা সংযোগ পরীক্ষক প্যাকেজ


0

স্বীকৃত উত্তরটি নিয়ে আমার কিছুটা সমস্যা রয়েছে তবে মনে হচ্ছে এটি অন্যদের উত্তর উত্তর সমাধান করে। আমি এমন একটি সমাধান চাই যা এটির ইউআরএলটি থেকে এটির প্রতিক্রিয়া পেতে পারে, তাই আমি ভেবেছিলাম যে HTTP সেই কার্যকারিতার জন্য দুর্দান্ত হবে এবং এর জন্য আমি এই উত্তরটি সত্যিই সহায়ক বলে খুঁজে পেয়েছি। আমি কীভাবে এইচটিটিপি অনুরোধগুলি (ফ্লার্ট / ডার্ট) ব্যবহার করে ইন্টারনেট সংযোগ পরীক্ষা করব?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.