(Флаттер) Как запустить статическую HTML-страницу вместо URL, если нет подключения к интернету?

У меня установлен flutter_webview_plugin. Я пытаюсь запустить пользовательскую статическую HTML-страницу вместо моего URL (мой веб-сайт wwww.duevents.in), если нет подключения к Интернету, поскольку страница "Веб-страница недоступна" не выглядит очень профессионально.

Я использую это для проверки интернета на устройстве, и он работает нормально ("connectionStatus == true", когда интернет подключен, и наоборот):

Future check() async {
try {
  final result = await InternetAddress.lookup('google.com');
  if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
    connectionStatus = true;
    print("connected $connectionStatus");
  }
} on SocketException catch (_) {
  connectionStatus = false;
  print("not connected $connectionStatus");
}

}

Это код, где у меня есть альтернативные URL для загрузки, если нет подключения к интернету:

WebviewScaffold(      
  url: connectionStatus == true ?"http://www.duevents.in" : Uri.dataFromString('<html><body>hello world</body></html>', mimeType: 'text/html').toString())

Почему-то он всегда показывает мне HTML-страницу с этим кодом, независимо от того, подключено ли устройство к Интернету или нет. Пожалуйста, скажите мне, что здесь не так.

2 ответа

Решение

Решение, предоставленное @Mazin Ibrahim в комментариях выше, сработало для меня.

Поэтому я выкладываю решение здесь:

    FutureBuilder(
        future: check(), // a previously-obtained Future or null
        builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
          if (connectionStatus == true) {
           //if Internet is connected
            return SafeArea(
                child: WebviewScaffold(
              url: "http://www.duevents.in"))}
               else{ 
                //If internet is not connected
                  return SafeArea(
                 child: WebviewScaffold(
                  url: Uri.dataFromString('<html><body>hello world</body></html>',
                    mimeType: 'text/html').toString()) }})

Я бы предложил вам изменить check() способ вернуть URL напрямую.

Future<String> getURL() async {
    try {
      final result = await InternetAddress.lookup('google.com');
      if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
        return "http://www.duevents.in";
      }
    } on SocketException catch (_) {
      return Uri.dataFromString('<html><body>hello world</body></html>', mimeType: 'text/html').toString();
    }
}

Итак, в FutureBuilder Вы можете использовать возвращенный URL-адрес сразу.

FutureBuilder(
        future: getURL(), // a previously-obtained Future or null
        builder: (BuildContext context, String url) {
            return SafeArea(
                child: WebviewScaffold(
                url: url))}
           })
Другие вопросы по тегам