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

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

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

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

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

12 ответов

Решение

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

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

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

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

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

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

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

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

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.

Я использовал следующий метод ниже. В зависимости от вашей записи все действительные URL-адреса должны иметь хост (например, google.com). Если URL-адрес не имеет хоста, он возвращает пустую строку (не неопределенную или нулевую).

        bool validURL = Uri.parse("https://google.com/").host == '' ? false : true;

Использование .isAbsolute, как уже сообщалось, помечает URL-адреса, такие как 'http:', как допустимые URL-адреса, а не как.

Проверка с использованием RegEx

      String hasValidUrl(String value) {
   String pattern = r'(http|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?';
   RegExp regExp = new RegExp(pattern);
   if (value.length == 0) {
        return 'Please enter url';
   }
   else if (!regExp.hasMatch(value)) {
     return 'Please enter valid url';
   }
   return null;
}  

Проверка с использованием встроенного пакета

      final Uri uri = Uri.tryParse(value);
if (!uri.hasAbsolutePath) {
     return 'Please enter valid url';
}

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

Для 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/ все.

Я использую этот способ для проверки URL-адресов. В вашем TextFormField используйте этот валидатор. здесь ваш URL должен начинаться с www.

      validator: (website) {
                      String pattern =
                          r'^((?:.|\n)*?)((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?)';
                      RegExp regExp = RegExp(pattern);
                      if (website.isEmpty) {
                        return "Please enter your website";
                      } else if (!(regExp.hasMatch(website))) {
                        return "Website Url must be started from www";
                      } else {
                        return null;
                      }
                    },

Используйте эту простую функцию, чтобы определить, является ли строка допустимым URL-адресом или нет.

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

Для этого вы можете использовать пакет url_launcher .

      Future<bool> checkIfUrlIsValid({required String url}) async {
if (await canLaunchUrl(Uri.parse(url))) {
  return true;
}
return false;}


checkIfUrlIsValid(url: 'https://google.com'); // true;
checkIfUrlIsValid(url: 'google com'); // false;

Если вы используете GetX, он предоставляет расширение строки под названием «isURL»:

      import 'package:get/get.dart';

final url = 'https://www.google.com/';

if (url.isURL) {
  print('Success');
}

Примечание: вам не следует устанавливать этот плагин, если вы будете использовать только это расширение. Идея состоит в том, чтобы воспользоваться им, если вы его уже используете.

Дополнительные расширения строк от GetX:

  • isNum
  • isNumericOnly
  • isAlphabetOnly
  • isBool
  • isDocumentFileName
  • isExcelFileName
  • isEmail
  • isPhoneNumber
  • isDateTime

И другие.

См.: https://github.com/jonataslaw/getx/blob/master/lib/get_utils/src/extensions/string_extensions.dart.

      TextEditingController urlController = TextEditingController();
String urlData = '';
static final GlobalKey<FormFieldState<String>> _orderFromkey =
GlobalKey<FormFieldState<String>>(); 

@overrideWidget build(контекст BuildContext) { return SafeArea(дочерний элемент: Scaffold(resizeToAvoidBottomInset: false,

              body: Column(
          children: [
            appBar(label: appName),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextFormField(
                key: _orderFromkey,
                controller: urlController,
                validator: (value) {
                  String patttern =  r"((https?:www\.)|(https?:\/\/)|(www\.))[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}(\/[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)?";
                  RegExp regExp = new RegExp(patttern);
                if (!regExp.hasMatch(value!)) {
                    return 'Please enter valid URL';
                  }
                },




                decoration: InputDecoration(

                    fillColor: appColor,
                    labelText: "url",
                    labelStyle: new TextStyle(color: appColor),
                    contentPadding: EdgeInsets.only(left: 10, right: 10),
                    enabledBorder: UnderlineInputBorder(
                      borderSide: BorderSide(color: appColor),
                    ),
                    focusedBorder: UnderlineInputBorder(
                      borderSide: BorderSide(color: black),
                    ),
                    hintText: 'Enter Your URL'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: InkWell(
                onTap: () {
                  print('_orderFromkey: ${_orderFromkey}');
                  final FormFieldState<String>? form =
                      _orderFromkey.currentState;
                  if (form!.validate()) {
                    urlData = urlController.text;
                    Get.toNamed('/showQr', arguments: urlData);
                    print('text : ${urlData}');
                  } else {
                    // _autoValidation = true;
                  }
                },
                child: Container(
                  width: ScreenSize.size.width * 0.6,
                  height: ScreenSize.size.height * 0.1,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: appColor,
                  ),
                  child: const Align(
                      alignment: Alignment.center,
                      child: Text(
                        'Submit',
                        style: TextStyle(
                            fontSize: 20,
                            color: white,
                            fontWeight: FontWeight.w700),
                        textAlign: TextAlign.center,
                      )),
                ),
              ),
            ),
          ],
        )),
  );

}

Другие вопросы по тегам