Mobil uygulamaların önemli bir kısmı aktif internet bağlantısı istemekte. Çoğu uygulama için kritik olan internet bağlantısının olup olmadığını Flutter ile geliştirdiğimiz mobil uygulamamızda nasıl test ederiz ? İnternet bağlantı durumunu nasıl dinleriz?
Eğer daha öncesinde ufak bir araştırma yapmışsanız connectivity_plus paketiyle karşılaştığınızı düşünmekteyim.
https://pub.dev/packages/connectivity_plus
Lakin stanDart’ın aksine farklı bir paket ile internet bağlantı durumunu kontrol edeceğiz.Çünkü yukarıdaki paket malesef Android’teki aşağıdaki limitasyonlara takılmakta 🙂
Note that on Android, this does not guarantee connection to Internet. For instance, the app might have wifi access but it might be a VPN or a hotel WiFi with no access.
Internet Connection Checker
https://pub.dev/packages/internet_connection_checker
Bu pakettin çalışma mantığını kısaca özetlersek varsayılan DNS sunucularını dürterek herhangi bir cevap alabilip alamadığını kontrol etmekte.Gelen cevaplara görede internet durumunu belirlemekte.
https://pub.dev/packages/internet_connection_checker#default_addresses
Varsayılan da gelen DNS sunucularına gönderilen istek belli bir timeout periyodu içerisinde cevap almalıdır. Aksi takdirde internetin olmadığı kararı verilir.
Bu listeye ekleme çıkarma yapılabilir lakin mevcut hali genel kullanım için yeterlidir.
Gelelim kullanımına. İnternet bağlantısının durumunu dinlemek için Connectivity sınıfından türetilen instance’a ait onConnectivityChanged Stream’ini dinlemek yeterlidir.
Dinlemeye başlanıldığı andan itibaren 10 saniyelik periyodlarla DNS sunucular istek atıp internet bağlantısını test eder
import 'package:connectivity_plus/connectivity_plus.dart';
@override
initState() {
super.initState();
subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
// Got a new connectivity status!
})
}
// Be sure to cancel subscription after you are done
@override
dispose() {
super.dispose();
subscription.cancel();
}
Her Stream.listener memory leak e yol açabileceğinden gerekmediğinde dispose edilip memoryyi rahatlatmak önerilmektedir.
Peki ya dinlemek değilde butona basınca o an test etsin dersek?
bool result = await InternetConnectionChecker().hasConnection;
if(result == true) {
print('YAY! Free cute dog pics!');
} else {
print('No internet :( Reason:');
print(InternetConnectionChecker().lastTryResults);
}
InternetConnectionChecker.hasConnection ise anlık durum bilgisini vermekte.Gelen cevap boolean tipte olup internet durumunu ifade etme.
Aslın kullanımı oldukça basit ,pekiii bunu nasıl State Management ile harmanlarım?
Örneği kullandığım bir projeden vereceğim. Flutter_BLOC kullanılan bu projede internet bağlantısını test eden bir bloc oluşturduk. Bloc içerisinde ise internet durumunu veren onStatusChange Stream’ini dinlemeye başladık ve duruma göre state emit ederek uygulama genelinde internet bağlantısına bağlı kontrolleri gerçekleştirebildik
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart';
part 'connection_state.dart';
part 'connection_cubit.freezed.dart';
class NetConnectionCubit extends Cubit<NetConnectionState> {
NetConnectionCubit(this.connectivity) : super(NetConnectionState.initial()){
connectSubs = connectivity.onStatusChange.listen((connectivityResult) {
switch (connectivityResult) {
case InternetConnectionStatus.connected:
print('bizim internetimiz var');
emit(NetConnectionState.online());
break;
case InternetConnectionStatus.disconnected:
emit(NetConnectionState.offline());
print('bir internetimiz vardı oda gitti matmazel');
break;
}
});
}
late final StreamSubscription<InternetConnectionStatus> connectSubs;
final InternetConnectionChecker connectivity;
Future<bool> get gotConnection async {
var connection = await connectivity.connectionStatus ==
InternetConnectionStatus.connected
? true
: false;
if (!connection) {
//Toast bildirimi ile kullanıcıyı uyardık.BotToast singleton yani her //seferinde aynı instance ı vermekte.
BotToast.showText(
text: 'There is no connection, please connect to internet',
contentColor: Colors.red,
);
}
return connection;
}
@override
Future<void> close() {
//memory leak ten herkes kaçınmalı :)
connectSubs.cancel();
return super.close();
}
}
Görüldüğü gibi oldukça basit bir kullanım mantığı var.State tarafından ise Frezeed tan destek alarak union sınıflarla durumları limitli olasılıklarla belirledik.
part of 'connection_cubit.dart';
@freezed
class NetConnectionState with _$NetConnectionState {
const factory NetConnectionState.initial() = _Initial;
const factory NetConnectionState.offline() = _Offline;
const factory NetConnectionState.online() = _Online;
}
Bir yanıt yazın