setState не вызывается при переходе на другую страницу

#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. Спасибо, сэр, но я не хотел постоянно проверять подключение