#flutter #dart
#трепетание #дротик
Вопрос:
Я проверяю, работает ли подключение, используя Connectivity().checkConnectivity()
его, но setState()
оно не вызывается, когда я перехожу на эту страницу.
Чтобы перейти с главной страницы на другую страницу, я использую Navigator.push(context, MaterialPageRoute(builder: (context) => search()));
а вот моя следующая страница
class search extends StatefulWidget {
@override
_searchState createState() => _searchState();
}
class _searchState extends State<search> {
List<filter> _list = [];
List<filter> to_display = [];
bool isoffline;
Future<void> connectivity() async {
var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.mobile) {
// I am connected to a mobile network.
setState(() {
isoffline = true;
});
print("connected");
} else if (connectivityResult == ConnectivityResult.wifi) {
setState(() {
isoffline = true;
});
// I am connected to a wifi network.
print("connected");
} else {
setState(() {
isoffline = false;
});
print(
"dissconneteddsfffffffffffffffffffffffffffffffffffffffffffffffffffffffdsfsd");
}
}
Future _future;
@override
void initState() {
mylist().then((value) {
setState(() {
_list = to_display = value;
});
});
connectivity();
print("value${isoffline}"); // this value is on null
_future = data();
super.initState();
}
print("value${isoffline}");
// это значение равно нулю
Комментарии:
1. setState не вызывается? чего именно вы хотите?
2. Я хочу установить
isoffline=false
, когда нет подключения к Интернету3. Оператор печати работает нормально, но
bool
значение не меняется4. Хорошо, тогда я думаю, вам нужно вызвать connectivity(); этот метод в вашем методе сборки, например @override Widget build(BuildContext context) connectivity(); { ….. } это. Потому что initState вызывается только один раз
5. Я получаю значение, подобное этому
value null
Ответ №1:
Функция connectivity является асинхронной функцией. Вы вызываете функцию и немедленно проверяете логическое значение, вот почему вы получаете null. Вам нужно дождаться выполнения, используя синтаксис await или then .
connectivity().then((value) {
print("value ${isoffline}");
});
Ответ №2:
В вашем коде connectivity();
есть метод async
, который означает, что для его завершения потребуется некоторое время.
Теперь, когда init
вызывается метод, он выполняется connectivity();
, а затем немедленно выполняется print("value${isoffline}");
, теперь значение для isoffline
initially равно null
, следовательно null
, печатается
решение заключается в том, чтобы либо ввести print("value${isoffline}");
connectivity();
метод, либо попытаться добавить его после build
метода.
@override
Widget build(BuildContext context) {
connectivity();
print("value${isoffline}");
return YourWidget();
}
Комментарии:
1. Спасибо, сэр, но я не хотел постоянно проверять подключение