Подключение к Интернету в режиме flutter

#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");
      },
    );
  }
}
  

Получите больше информации об этом пакете здесь.