Я проверил, мобильный телефон подключен к Интернету или нет. Я использовал этот способ. Это работает очень хорошо. Но я использовал этот способ каждый урок. дублируется один и тот же код. Я не понимаю, как использовать этот код в глобальном масштабе.
инициализировать переменную
bool isOffline = false;
initState
@override
void initState() {
ConnectionStatusSingleton connectionStatus =
ConnectionStatusSingleton.getInstance();// connectionStatusSingleton is another class
_connectionChangeStream =
connectionStatus.connectionChange.listen(connectionChanged);
connectionChanged(connectionStatus.hasConnection);
super.initState();
}
метод connectionChanged
void connectionChanged(dynamic hasConnection) {
setState(() {
isOffline = !hasConnection;
});
}
После этого я использовал в виджетеЕсли соединение недоступно, я отобразил appBar,
appBar: isOffline
? PreferredSize(
preferredSize: Size.fromHeight(20.0),
child: AppBar(
leading: Container(),
centerTitle: true,
backgroundColor: Colors.red,
title: Text(
AppTranslations.of(context).text("connection_drop"),
style: TextStyle(fontSize: 15.0, color: Colors.white),
),
),
)
: null,





Для этого вы можете использовать StreamBuilder. Просто оберните им виджеты, которые зависят от этого Stream.
Что-то вроде этого:
void main() {
runApp(App());
}
class App extends StatelessWidget {
const App({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: StreamBuilder<ConnectivityResult>(
stream: Connectivity().onConnectivityChanged,
initialData: ConnectivityResult.none,
builder: (context, snapshot) {
switch (snapshot.data) {
case ConnectivityResult.wifi:
return Text("we're on a wifi network");
case ConnectivityResult.mobile:
return Text("we're on a mobile network");
case ConnectivityResult.none:
return Text('no network connection');
}
},
),
),
),
);
}
}
Кроме того, вы можете взглянуть на https://pub.dev/packages/connectivity и https://pub.dev/packages/data_connection_checker.
Чтобы повторно использовать виджет AppBar, вы можете извлечь его в отдельный класс:
class MyAppBar extends StatelessWidget {
...
@override
Widget build(BuildContext context) {
return AppBar(
title: StreamBuilder<ConnectivityResult>(
...
),
);
}
...
}
// every time you need it, just pass it as an argument to the `Scaffold`'s `appBar` parameter.
...
Scaffold(
...
appbar: MyAppBar();
...
)
...
Обновлено: я улучшил пример кода тем, что действительно работает.
Приходит ошибка
@user9139407 user9139407 Я сделал еще одно редактирование, чтобы упростить код, добавив initialData: ConnectivityResult.none и удалив ненужный код.
Принцип работы pub.dev/пакеты/подключение заключается в том, что он не проверяет подключение к Интернету. Так что да, если вы хотите надежно определить, доступно ли подключение для передачи данных, вы можете использовать stackoverflow.com/a/49648870/9139407. Если вы внимательно прочитаете комментарии к этому ответу, вы увидите, что «google.com» недоступен для Китая, поэтому, возможно, вы захотите ping 'example.com' или какой-либо другой адрес (возможно, сервис, который вы пытаетесь использовать), но имейте в виду, что вы не должны полагаться на состояние подключения для выполнения сетевых запросов, т.е. всегда оборачивайте свои индивидуальные запросы в try-catch
комментарий продолжается: у меня уже была эта проблема, и я решил создать пакет, который ее решает. pub.dev/packages/data_connection_checker Работает аналогично методу в stackoverflow.com/a/49648870/9139407.
спасибо за поддержку. Я отредактировал свой ответ. Если соединение недоступно, я отображаю appBar, если доступно, не отображает appBar
мое устройство подключено к Интернету. но первый снимок snapshot.data равен нулю, no network connection после отключения интернета и подключения к интернету работает
Сэр, я спросил, как использовать этот код в глобальном масштабе. Я имею в виду, что я показываю панель приложений на каждой странице, когда мобильный телефон не в сети. Итак, в приведенном выше коде я использовал каждый класс... Я спросил, как создать общий класс и получить доступ к любым классам?
Извините за отсутствие английского
О, понял. Просто извлеките AppBar в отдельный виджет. Я обновил свой ответ минимальным примером.
Тип аргумента «StreamBuilder» не может быть назначен типу параметра «PreferredSizeWidget».