Flutter не запускает динамические URL-адреса, полученные в ответ от API.

Я пытался запустить URL-адрес в приложении Flutter. Я использую url_launcher, но не могу запустить URL. URL-адрес, который я получаю, является ответом от API.

Если я копирую ответ и отправляю его статически, он работает, но при передаче в качестве динамической переменной всегда показывает «Не удалось запустить».

Код:

        checkoutCartItem() async {
  var url = Uri.parse(
      '');
  final headers = {'Content-Type': 'application/json'};
  var body = jsonEncode({
    "status": 2,
    "uid": SignForm.userIdGlobal,
  });
  final encoding = Encoding.getByName('utf-8');

  Response response = await post(
    url,
    headers: headers,
    body: body,
    encoding: encoding,
  );
  print(response.body);

  Body.url = response.body.toString();
  print(Body.url);

  if (await canLaunch(Body.url.toString())) {
    await launch(Body.url.toString());
  } else {
    throw 'Could not launch $Body.url';
  }
}

Версия Flutter: 2.2,

url_launcher: ^6.0.4

Ошибка:

      [VERBOSE-2:ui_dart_state.cc(199)] Unhandled Exception: Could not launch [TextElement: '
', LinkElement: 'https://www.bsestarmf.in/ClientOrderPayment.aspx?K4HhW6zSxVp2T2sl9n5acA+J8qCjHcdVy2hyQmgbsuje2e6rf0+sujJisssdsaBFQV1zicfCer4VQUqJtRxgRiLYXwfXKkOBj9pA5dqrlOiLEPkxgWpB0QQa36DMiHhyqCA/fP60nFus9nGlM='
      print(response.body)

Дает:

      https://www.bsestarmf.in/ClientOrderPayment.aspx?K4HhW6zSxVp2T2sl9n5acA+J8qCjHcdVy2hyQmgbsuje2e6rf0+sujJiBFQV1zicfCer4VQUqJtRxgRiLYXwfXKkOBj9dddddpA5dqrlOiLEPkxgWpB0QQa36DMiHhyqCA/fP60nFus9nGlM=
[VERBOSE-2:ui_dart_state.cc(199)] Unhandled Exception: Could not launch Body.url
#0      checkoutCartItem (package:optymoney/Cart/Components/Body.dart:58:5)
<asynchronous suspension>
#1      _BodyState.build.<anonymous closure>.<anonymous closure> (package:optymoney/Cart/Components/Body.dart:326:29)
<asynchronous suspension>

Это ссылка для оплаты, которая должна открывать браузер внутри приложения Flutter. Но теперь это работает.

Пожалуйста помоги!!!

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

1 ответ

      final payUrl = Uri.encodeFull(response.body);
  if (await canLaunch(payUrl)) {
    await launch(payUrl, forceWebView: true, enableJavaScript: true);
  } else {
    throw 'Could not launch $payUrl';
  }

Вот как я решил проблемы. Оказалось, что кодирование полученного ответа было необходимым решением.

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