(Flutter) Как запустить статическую 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-страницу с этим кодом, независимо от того, подключено ли устройство к Интернету или нет. Подскажите пожалуйста, что здесь не так.


person Aman Kataria    schedule 21.03.2019    source источник
comment
Вы пробовали использовать FutureBuilder?   -  person Mazin Ibrahim    schedule 21.03.2019
comment
@Mazin Нет. Где мне это здесь нужно?   -  person Aman Kataria    schedule 21.03.2019
comment
это решение поможет вам реализовать FutureBuilder, чтобы вы могли проверять состояние подключения только после его получения stackoverflow.com/questions/54634418/   -  person Mazin Ibrahim    schedule 21.03.2019
comment
что я должен отнести к «будущему:»? P.S. Прошу прощения за то, что задаю много вопросов, я новичок в этом материале, поэтому знаю очень мало.   -  person Aman Kataria    schedule 21.03.2019
comment
Ваш check() метод. Так будет future: check(),   -  person Mazin Ibrahim    schedule 21.03.2019


Ответы (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()) }})
person Aman Kataria    schedule 21.03.2019

Я предлагаю вам изменить метод 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))}
           })
person C. Tatu    schedule 22.03.2019