#flutter #dart #connectivity
#flutter #dart #подключение
Вопрос:
Как реализовать непрерывную проверку подключения к Интернету в flutter только один раз для всего приложения, у меня почти полное приложение, теперь мне нужно добавить проверку подключения к Интернету, пожалуйста, помогите, заранее спасибо
@override
Widget build(BuildContext context) {
return StreamBuilder<ConnectivityResult>(
stream: connectivityStream,
builder: (context, snapshot) {
if (snapshot.hasData) {
final connectivityResult = snapshot.data;
if (connectivityResult == ConnectivityResult.none) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: NoInternetConnectionScreen(),
);
}
return MaterialApp(
debugShowCheckedModeBanner: false,
home: SplashScreen(),
routes: routes,
);
} else if (snapshot.hasError) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: NoInternetConnectionScreen(),
);
}
return Center(child: CircularProgressIndicator());
}
);
}
Комментарии:
1. Можете ли вы определить «доступ в Интернет»? Устройство предлагает интерфейс для проверки, подключены ли вы к сети, но нет способа определить, достигнете ли вы конечной точки, которой хотите достичь, пока вы не попробуете. Вы можете выполнить пинг сайта, которому доверяете, чтобы он всегда был в рабочем состоянии (например, Google), но это не гарантирует, что ваш сайт работает. Чтобы гарантировать, что ваш сайт запущен, вам необходимо подключиться и убедиться в этом самостоятельно. И тогда вам решать, как часто вы хотите проверять и сколько пользователей взимают плату, а пропускную способность вы хотите потратить на это.
Ответ №1:
Плагин подключения указывает в своих документах, что он предоставляет информацию только при наличии сетевого подключения, но не в том случае, если сеть подключена к Интернету
Обратите внимание, что на Android это не гарантирует подключение к Интернету. Например, приложение может иметь доступ к Wi-Fi, но это может быть VPN или Wi-Fi отеля без доступа.
Вы можете использовать
import 'dart:io';
...
try {
final result = await InternetAddress.lookup('google.com');
if (result.isNotEmpty amp;amp; result[0].rawAddress.isNotEmpty) {
print('connected');
}
} on SocketException catch (_) {
print('not connected');
}
Комментарии:
1. Я должен проверять на каждом экране?
2. У вас всегда должен быть отдельный класс HTTPService, который не будет классом пользовательского интерфейса и будет выполнять все http-вызовы. Там вы можете получить это только один раз
3. Кроме того, не проверяйте
google.com
. Домен может быть недоступен в нескольких странах, например, в Китае. Всегда используйтеexample.com
для этой цели выделенный официальный домен
Ответ №2:
Я думаю, что наилучшей практикой было бы использовать плагин подключения и обернуть ваше приложение в stream builder
https://pub.dev/packages/connectivity
Ваш главный экран / главная страница должна быть примерно такой:
class MainScreen extends StatelessWidget {
Stream connectivityStream = Connectivity().onConnectivityChanged;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppStyle.backgroundColor,
body: StreamBuilder<ConnectivityResult>(
stream: connectivityStream,
builder: (context, snapshot) {
if (snapshot.hasData) {
final connectivityResult = snapshot.data;
if (connectivityResult == ConnectivityResult.none) {
return NoConnectionPage();
}
return HomePage();
} else if (snapshot.hasError) {
return NoConnectionPage();
// or some error page, but I think no connection page is what you
// want here
}
return Center(child: CircularProgressIndicator());
}
)
);
}
}
В NoConnectionPage() у вас может быть кнопка, которая повторяет попытку подключения с помощью метода, подобного этому:
void _retryConnection() async {
try {
final result = await InternetAddress.lookup('example.com');
if (result.isNotEmpty amp;amp; result[0].rawAddress.isNotEmpty) {
print('connected');
Navigator.of(context).pop(); // going back to MainScreen()
}
} on SocketException catch (_) {
print('not connected');
}
}
Комментарии:
1. Также вы должны использовать example.com вместо google.com , потому что в некоторых регионах google.com недоступно
2. Это работает только на главном экране, как обрабатывать для всех экранов? когда я проверяю на следующем экране, это не работает
3. @AmirMujtaba так что постарайтесь учесть ваше приложение MaterialApp / CupertinoApp. создайте файл dart с помощью StreamBuilder и, пожалуйста, дайте мне знать
4. в обоих случаях (подключено или нет) Я возвращаю приложение material с другим домом, если подключено в приложении material app home — это экран-заставка, который перемещается по экрану авторизации, на экране авторизации, когда я отключаю соединение, исчезает только тема, а не сам экран..
5. Пожалуйста, отредактируйте свой вопрос и добавьте туда свой файл main.dart
Ответ №3:
Просто используйте internet_connectivity_checker
пакет, подобный этому :
class Hello extends StatelessWidget {
const Hello({super.key});
@override
Widget build(BuildContext context) {
return internetConnectivityBuilder(
(status) {
bool connected = status == ConnectivityStatus.online;
return Text(connected ? "Online" : "Offline");
},
);
}
}
Получите больше информации об этом пакете здесь.