Dart / Flutter - проверка строки для URL

Я пытаюсь создать систему, в которой я могу проверить строку, чтобы проверить, является ли это URL-адресом или нет. (https://www.google.com/)

Я нашел пакет flutter валидатор, но он не совместим с dart 2, поэтому не будет совместим с моим кодом.

С аналогичным названием я также нашел пакет валидаторов, но я не могу заставить его правильно работать с мой код, так как он выдает следующую ошибку; (надеюсь, вам нравится название моего проекта;)

Because every version of flutter_test from sdk depends on test 1.3.0 
and every version of validators depends on test ^1.3.3, flutter_test from sdk is incompatible with validators.
So, because gucci depends on both validators ^1.0.0+1 and flutter_test any from sdk, version solving failed.
Unable to reload your application because "flutter packages get" failed to update package dependencies.
Exception: pub get failed (1)

Если бы вы могли либо найти исправление для validators, чтобы оно не вызывало эту ошибку и, следовательно, правильно работало с моим кодом, либо предложить другой метод проверки строки на соответствие URL-адресу, это было бы здорово.

Спасибо

Изменить - Мой pubspec.yaml файл

name: gucci
description: A new Flutter project.

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons:
  barcode_scan:
  gradient_app_bar:
  url_launcher:
  validate: ^1.7.0

dev_dependencies:
  flutter_test:
    sdk: flutter

  fonts:
    - family: PlayfairDisplay
      fonts:
        - asset: fonts/PlayfairDisplay-BoldItalic.ttf

    - family: Kanit
      fonts:
        - asset: fonts/Kanit-ExtraBoldItalic.ttf

    - family: Poppins
      fonts:
        - asset: fonts/Poppins-BoldItalic.ttf

    - family: PoppinsLightItalic
      fonts:
        - asset: fonts/Poppins-LightItalic.ttf

    - family: PoppinsMediumItalic
      fonts:
        - asset: fonts/Poppins-MediumItalic.ttf

person Jake    schedule 24.10.2018    source источник
comment
А что насчет Uri.html(...)?   -  person Günter Zöchbauer    schedule 24.10.2018
comment
Не могли бы вы привести мне пример?   -  person Jake    schedule 24.10.2018
comment
Вот что я узнал. Я пытаюсь print(new Uri.http("$text", ""),); просто вернуть результат, но я не знаю, как проверить, как указано в моем исходном вопросе   -  person Jake    schedule 24.10.2018
comment
Попробуйте Uri.parse(text); Если URI недействителен, должно возникнуть исключение.   -  person Günter Zöchbauer    schedule 24.10.2018
comment
Это то, что мне нужно, создавая строку с помощью этого метода? String endResultConvert = Uri.parse(testResult);   -  person Jake    schedule 24.10.2018
comment
Как выглядит ваш pubspec.yaml? Похоже, у вас есть конфликт версий, который можно разрешить.   -  person rmtmckenzie    schedule 25.10.2018
comment
Пожалуйста, проверьте мои изменения, добавил мой pubspec.yaml файл   -  person Jake    schedule 25.10.2018
comment
@rmtmckenzie вам удалось взглянуть на мою правку?   -  person Jake    schedule 28.10.2018


Ответы (5)


По какой-то причине пакет validators требует довольно свежей версии библиотеки тестирования flutter, а не оставляет ее на усмотрение приложения. Возможно, для этого есть веская причина (например, они используют новую функцию).

Для внутреннего механизма флаттера требуется определенная версия библиотеки flutter_test (поэтому, как правило, указывать ее версию - плохая идея). Итак, чтобы исправить это, вам нужно обновить флаттер, запустив flutter upgrade. Если вы уже используете самую последнюю версию канала, в котором находитесь, возможно, вам придется запустить flutter channel dev или flutter channel master, чтобы переключиться на канал (на самом деле ветвь), который обновляется чаще.

По большей части я использую ветку / канал dev, и хотя иногда возникают проблемы, их случаются нечасто. Однако я бы посоветовал не использовать основную ветку, если это возможно.

person rmtmckenzie    schedule 29.10.2018
comment
Попробовав это сейчас, я свяжусь с вами как можно скорее. - person Jake; 29.10.2018
comment
Это сработало, спасибо! Теперь началось правильное использование Validators - person Jake; 29.10.2018

Чтобы проверить действительную строку URL, вам просто нужно использовать Uri.parse(), как показано ниже.

bool _validURL = Uri.parse(_adVertData.webLink).isAbsolute;

Просто проверьте значение _validURL

person iPatel    schedule 04.10.2019
comment
Это также возвращает истину для строки http :. - person AmitB10; 27.07.2020
comment
Также существует Uri.tryParse, который не генерирует исключение в случае недопустимой строки uri. - person matwr; 24.02.2021

var urlPattern = r"(https?|http)://([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?";
var match = new RegExp(urlPattern, caseSensitive: false).firstMatch('https://www.google.com');
match = RegExp(urlPattern, caseSensitive: false).firstMatch('http://www.google.com');

Вы также можете использовать RegExp.

person John Wang    schedule 14.04.2019

Uri.tryParse(mystring)?.hasAbsolutePath ?? false;

Некоторые примеры результатов:

url result
'https://stackoverflow.com/questions/52975739/dart-flutter-validating-a-string-for-url' true
asd false
asd:asd false
%EMPTY_STRING% false
google.nl false
https: false
https:// false
https://a false
https://a/ true
person Robin Dijkhof    schedule 09.05.2021
comment
Стоит отметить, что это также будет true для / или любого другого Uri, отличного от http (s) (например, ftp:/). Если вы также хотите проверить это, это должно быть: final uri = Uri.tryParse('/'); final isValid = uri != null && uri.hasAbsolutePath && uri.scheme.startsWith('http'); - person enyo; 15.07.2021

Для RegExp, если вы собираетесь найти URL-адрес в строке, вы можете использовать этот.

r'^((?:.|\n)*?)((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?)'

Его можно использовать, когда вы выделяете URL-адрес в строке. Например, в приложении чата вы можете выделить URL-адрес в отправленном сообщении чата. Это проверяет google.com, https://google.com, http://google.com все.

person Ares    schedule 27.02.2020
comment
Привет @Ares, я уже пробовал ваше регулярное выражение, но оно не проверяет https://google.com, http://google.com и google.com - person R Rifa Fauzi Komara; 14.04.2020
comment
На самом деле я использую это для проверки, и он работает нормально. Пожалуйста, укажите подробно, как вы пытаетесь использовать регулярное выражение. @RRifaFauziKomara - person Ares; 15.04.2020