Agora-Flutter-SDK icon indicating copy to clipboard operation
Agora-Flutter-SDK copied to clipboard

Agora service doesn't start on web with Flutter 3.22.1

Open Silfalion opened this issue 1 year ago • 0 comments

Version of the agora_rtc_engine

6.3.1

Platforms affected

  • [ ] Android
  • [ ] iOS
  • [ ] macOS
  • [ ] Windows
  • [X] Web

Steps to reproduce

  1. Copy the example in the github
  2. Run it with flutter 3.22.1 on web

Expected results

That the service starts

Actual results

returns an error:

require.js:143 Uncaught Error: Mismatched anonymous define() module: function () {
    return function () {
        var e = {
            3221: function (e, t, n) {
                e.exports = function () {
                    "use strict"; function e(e, t) { return t.forEach((function (t) { t && "string" != typeof t && !Array.isArray(t) && Object.keys(t).forEach((function (n) { if ("default" !== n && !(n in e)) { var i = Object.getOwnPropertyDescriptor(t, n); Object.defineProperty(e, n, i.get ? i : { enumerable: !0, get: function () { return t[n] } }) } })) })), Object.freeze(e) } var t = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : void 0 !== n.g ? n.g : "undefined" != typeof self ? self : {}; function i(e) { return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e } var r = function (e) { try { return !!e() } catch (e) { return !0 } }, o = !r((function () { var e = function () { }.bind(); return "function" != typeof e || e.hasOwnProperty("prototype") })), s = o, a = Function.prototype, c = a.call, E = s && a.bind.bind(c, c), d = s ? E : function (e) { return function () { return c.apply(e, arguments) } }, _ = d({}.isPrototypeOf), l = function (e) { return e && e.Math == Math && e }, u = l("object" == typeof globalThis && globalThis) || l("object" == typeof window && window) || l("object" == typeof self && self) || l("object" == typeof t && t) || function () { return this }() || t || Function("return this")(), R = o, h = Function.prototype, T = h.apply, p = h.call, I = "object" == typeof Reflect && Reflect.apply || (R ? p.bind(T) : function () { return p.apply(T, arguments) }), A = d, O = A({}.toString), C = A("".slice), S = function (e) { return C(O(e), 8, -1) }, N = S, g = d, f = function (e) { if ("Function" === N(e)) return g(e) }, m = "object" == typeof document && document.all, D = { all: m, IS_HTMLDDA: void 0 === m && void 0 !== m }, P = D.all, v = D.IS_HTMLDDA ? function (e) { return "function" == typeof e || e === P } : function (e) { return "function" == typeof e }, L = {}, b = !r((function () { return 7 != Object.defineProperty({}, 1, { get: function () { return 7 } })[1] })), y = o, M = Function.prototype.call, w = y ? M.bind(M) : function () { return M.apply(M, arguments) }, U = {}, k = {}.propertyIsEnumerable, V = Object.getOwnPropertyDescriptor, G = V && !k.call({ 1: 2 }, 1); U.f = G ? function (e) { var t = V(this, e); return !!t && t.enumerable } : k; var F, x, B = function (e, t) { return { enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: t } }, H = r, Y = S, j = Object, W = d("".split), K = H((function () { return !j("z").propertyIsEnumerable(0) })) ? function (e) { return "String" == Y(e) ? W(e, "") : j(e) } : j, X = function (e) { return null == e }, J = X, q = TypeError, z = function (e) { if (J(e)) throw q("Can't call method on " + e); return e }, Q = K, Z = z, $ = function (e) { return Q(Z(e)) }, ee = v, te = D.all, ne = D.IS_HTMLDDA ? function (e) { return "object" == typeof e ? null !== e : ee(e) || e === te } : function (e) { return "object" == typeof e ? null !== e : ee(e) }, ie = {}, re = ie, oe = u, se = v, ae = function (e) { return se(e) ? e : void 0 }, ce = function (e, t) { return arguments.length < 2 ? ae(re[e]) || ae(oe[e]) : re[e] && re[e][t] || oe[e] && oe[e][t] }, Ee = "undefined" != typeof navigator && String(navigator.userAgent) || "", de = u, _e = Ee, le = de.process, ue = de.Deno, Re = le && le.versions || ue && ue.version, he = Re && Re.v8; he && (x = (F = he.split("."))[0] > 0 && F[0] < 4 ? 1 : +(F[0] + F[1])), !x && _e && (!(F = _e.match(/Edge\/(\d+)/)) || F[1] >= 74) && (F = _e.match(/Chrome\/(\d+)/)) && (x = +F[1]); var Te = x, pe = Te, Ie = r, Ae = u.String, Oe = !!Object.getOwnPropertySymbols && !Ie((function () { var e = Symbol(); return !Ae(e) || !(Object(e) instanceof Symbol) || !Symbol.sham && pe && pe < 41 })), Ce = Oe && !Symbol.sham && "symbol" == typeof Symbol.iterator, Se = ce, Ne = v, ge = _, fe = Object, me = Ce ? function (e) { return "symbol" == typeof e } : function (e) { var t = Se("Symbol"); return Ne(t) && ge(t.prototype, fe(e)) }, De = String, Pe = function (e) { try { return De(e) } catch (e) { return "Object" } }, ve = v, Le = Pe, be = TypeError, ye = function (e) { if (ve(e)) return e; throw be(Le(e) + " is not a function") }, Me = ye, we = X, Ue = function (e, t) { var n = e[t]; return we(n) ? void 0 : Me(n) }, ke = w, Ve = v, Ge = ne, Fe = TypeError, xe = { exports: {} }, Be = u, He = Object.defineProperty, Ye = function (e, t) { try { He(Be, e, { value: t, configurable: !0, writable: !0 }) } catch (i) { Be[e] = t } return t }, je = "__core-js_shared__", We = u[je] || Ye(je, {}), Ke = We; (xe.exports = function (e, t) { return Ke[e] || (Ke[e] = void 0 !== t ? t : {}) })("versions", []).push({ version: "3.31.1", mode: "pure", copyright: "© 2014-2023 Denis Pushkarev (zloirock.ru)", license: "https://github.com/zloirock/core-js/blob/v3.31.1/LICENSE", source: "https://github.com/zloirock/core-js" }); var Xe = xe.exports, Je = z, qe = Object, ze = function (e) { return qe(Je(e)) }, Qe = ze, Ze = d({}.hasOwnProperty), $e = Object.hasOwn |/*! formdata-polyfill. MIT License. Jimmy W?rting <https://jimmy.warting.se/opensource> */!function () { var e; function n(e) { var t = 0; return function () { return t < e.length ? { done: !1, value: e[t++] } : { done: !0 } } } var i, r = "function" == typeof Object.defineProperties ? Object.defineProperty : function (e, t, n) { return e == Array.prototype || e == Object.prototype || (e[t] = n.value), e }, o = function (e) { e = ["object" == typeof globalThis && globalThis, e, "object" == typeof window && window, "object" == typeof self && self, "object" == typeof t && t]; for (var n = 0; n < e.length; ++n) { var i = e[n]; if (i && i.Math == Math) return i } throw Error("Cannot find global object") }(this); function s(e, t) { if (t) e: { var n = o; e = e.split("."); for (var i = 0; i < e.length - 1; i++) { var s = e[i]; if (!(s in n)) break e; n = n[s] } (t = t(i = n[e = e[e.length - 1]])) != i && null != t && r(n, e, { configurable: !0, writable: !0, value: t }) } } function a(e) { return (e = { next: e })[Symbol.iterator] = function () { return this }, e } function c(e) { var t = "undefined" != typeof Symbol && Symbol.iterator && e[Symbol.iterator]; return t ? t.call(e) : { next: n(e) } } if (s("Symbol", (function (e) { function t(e, t) { this.A = e, r(this, "description", { configurable: !0, writable: !0, value: t }) } if (e) return e; t.prototype.toString = function () { return this.A }; var n = "jscomp_symbol_" + (1e9 * Math.random() >>> 0) + "_", i = 0; return function e(r) { if (this instanceof e) throw new TypeError("Symbol is not a constructor"); return new t(n + (r || "") + "_" + i++, r) } })), s("Symbol.iterator", (function (e) { if (e) return e; e = Symbol("Symbol.iterator"); for (var t = "Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "), i = 0; i < t.length; i++) { var s = o[t[i]]; "function" == typeof s && "function" != typeof s.prototype[e] && r(s.prototype, e, { configurable: !0, writable: !0, value: function () { return a(n(this)) } }) } return e })), "function" == typeof Object.setPrototypeOf) i = Object.setPrototypeOf; else { var E; e: { var d = {}; try { d.__proto__ = { a: !0 }, E = d.a; break e } catch (e) { } E = !1 } i = E ? function (e, t) { if (e.__proto__ = t, e.__proto__ !== t) throw new TypeError(e + " is not extensible"); return e } : null } var _ = i; function l() { this.m = !1, this.j = null, this.v = void 0, this.h = 1, this.u = this.C = 0, this.l = null } function u(e) { if (e.m) throw new TypeError("Generator is already running"); e.m = !0 } function R(e, t) { return e.h = 3, { value: t } } function h(e) { this.g = new l, this.G = e } function T(e, t, n, i) { try { var r = t.call(e.g.j, n); if (!(r instanceof Object)) throw new TypeError("Iterator result " + r + " is not an object"); if (!r.done) return e.g.m = !1, r; var o = r.value } catch (t) { return e.g.j = null, e.g.s(t), p(e) } return e.g.j = null, i.call(e.g, o), p(e) } function p(e) { for (; e.g.h;)try { var t = e.G(e.g); if (t) return e.g.m = !1, { value: t.value, done: !1 } } catch (t) { e.g.v = void 0, e.g.s(t) } if (e.g.m = !1, e.g.l) { if (t = e.g.l, e.g.l = null, t.F) throw t.D; return { value: t.return, done: !0 } } return { value: void 0, done: !0 } } function I(e) { this.next = function (t) { return e.o(t) }, this.throw = function (t) { return e.s(t) }, this.return = function (t) { return function (e, t) { u(e.g); var n = e.g.j; return n ? T(e, "return" in n ? n.return : function (e) { return { value: e, done: !0 } }, t, e.g.return) : (e.g.return(t), p(e)) }(e, t) }, this[Symbol.iterator] = function () { return this } } function A(e, t) { return t = new I(new h(t)), _ && e.prototype && _(t, e.prototype), t } if (l.prototype.o = function (e) { this.v = e }, l.prototype.s = function (e) { this.l = { D: e, F: !0 }, this.h = this.C || this.u }, l.prototype.return = function (e) { this.l = { return: e }, this.h = this.u }, h.prototype.o = function (e) { return u(this.g), this.g.j ? T(this, this.g.j.next, e, this.g.o) : (this.g.o(e), p(this)) }, h.prototype.s = function (e) { return u(this.g), this.g.j ? T(this, this.g.j.throw, e, this.g.o) : (this.g.s(e), p(this)) }, s("Array.prototype.entries", (function (e) { return e || function () { return function (e, t) { e instanceof String && (e += ""); var n = 0, i = !1, r = { next: function () { if (!i && n < e.length) { var r = n++; return { value: t(r, e[r]), done: !1 } } return i = !0, { done: !0, value: void 0 } } }; return r[Symbol.iterator] = function () { return r }, r }(this, (function (e, t) { return [e, t] })) } })), "undefined" != typeof Blob && ("undefined" == typeof FormData || !FormData.prototype.keys)) { var O = function (e, t) { for (var n = 0; n < e.length; n++)t(e[n]) }, C = function (e) { return e.replace(/\r?\n|\r/g, "\r\n") }, S = function (e, t, n) { return t instanceof Blob ? (n = void 0 !== n ? String(n + "") : "string" == typeof t.name ? t.name : "blob", t.name ==                }()
            }, 2964: function (e, t) { "use strict"; var n, i, r, o, s, a, c, E, d, _, l, u, R, h, T, p, I, A, O, C, S, N, g, f, m, D, P, v, L, b, y, M, w, U, k, V, G, F, x, B, H, Y, j, W, K, X, J, q, z, Q, Z, $, ee, te, ne, ie, re, oe, se, ae, ce, Ee, de, _e, le, ue, Re, he, Te, pe, Ie, Ae, Oe, Ce, Se, Ne, ge, fe, me, De, Pe, ve, Le, be, ye, Me, we, Ue, ke, Ve, Ge, Fe, xe, Be, He, Ye, je, We, Ke, Xe, Je; Object.defineProperty(t, "__esModule", { value: !0 }), t.QUALITY_ADAPT_INDICATION = t.CLIENT_ROLE_TYPE = t.RtcStats = t.WatermarkOptions = t.WatermarkRatio = t.Rectangle = t.SimulcastStreamConfig = t.SIMULCAST_STREAM_MODE = t.DataStreamConfig = t.VideoEncoderConfiguration = t.CodecCapInfo = t.CodecCapLevels = t.CODEC_CAP_MASK = t.VIDEO_MIRROR_MODE_TYPE = t.AdvanceOptions = t.ENCODING_PREFERENCE = t.COMPRESSION_PREFERENCE = t.EncodedVideoFrameInfo = t.MAX_USER_ACCOUNT_LENGTH_TYPE = t.VideoSubscriptionOptions = t.VIDEO_STREAM_TYPE = t.H264PacketizeMode = t.AudioPcmDataInfo = t.EncodedAudioFrameInfo = t.EncodedAudioFrameAdvancedSettings = t.WATERMARK_FIT_MODE = t.AUDIO_ENCODING_TYPE = t.AUDIO_CODEC_TYPE = t.SenderOptions = t.TCcMode = t.VIDEO_CODEC_TYPE = t.VIDEO_CODEC_CAPABILITY_LEVEL = t.SCREEN_CAPTURE_FRAMERATE_CAPABILITY = t.VideoDimensions = t.DEGRADATION_PREFERENCE = t.ORIENTATION_MODE = t.VIDEO_FRAME_TYPE = t.FRAME_HEIGHT = t.FRAME_WIDTH = t.FRAME_RATE = t.VIDEO_ORIENTATION = t.FIT_MODE_TYPE = t.QUALITY_TYPE = t.INTERFACE_ID_TYPE = t.USER_OFFLINE_REASON_TYPE = t.AUDIO_SESSION_OPERATION_RESTRICTION = t.LICENSE_ERROR_TYPE = t.ERROR_CODE_TYPE = t.WARN_CODE_TYPE = t.CHANNEL_PROFILE_TYPE = void 0, t.WLACC_MESSAGE_REASON = t.CLIENT_ROLE_CHANGE_FAILED_REASON = t.CONNECTION_CHANGED_REASON_TYPE = t.LastmileProbeResult = t.LastmileProbeOneWayResult = t.LASTMILE_PROBE_RESULT_STATE = t.LastmileProbeConfig = t.VIDEO_TRANSCODER_ERROR = t.LocalTranscoderConfiguration = t.TranscodingVideoStream = t.LiveTranscoding = t.TranscodingUser = t.CONNECTION_STATE_TYPE = t.LiveStreamAdvancedFeature = t.RtcImage = t.RTMP_STREAMING_EVENT = t.RTMP_STREAM_PUBLISH_REASON = t.RTMP_STREAM_PUBLISH_STATE = t.LocalAudioStats = t.AUDIO_CODEC_PROFILE_TYPE = t.VIDEO_CODEC_PROFILE_TYPE = t.VIDEO_CODEC_TYPE_FOR_STREAM = t.AUDIO_SAMPLE_RATE_TYPE = t.Packet = t.DeviceInfo = t.AudioVolumeInfo = t.REMOTE_VIDEO_DOWNSCALE_LEVEL = t.VideoTrackInfo = t.REMOTE_USER_STATE = t.REMOTE_VIDEO_STATE_REASON = t.REMOTE_VIDEO_STATE = t.REMOTE_AUDIO_STATE_REASON = t.REMOTE_AUDIO_STATE = t.LOCAL_VIDEO_STREAM_REASON = t.LOCAL_VIDEO_STREAM_STATE = t.LOCAL_AUDIO_STREAM_REASON = t.LOCAL_AUDIO_STREAM_STATE = t.CAPTURE_BRIGHTNESS_LEVEL_TYPE = t.VIDEO_QOE_PREFERENCE_TYPE = t.VIDEO_APPLICATION_SCENARIO_TYPE = t.SCREEN_SCENARIO_TYPE = t.VIDEO_CONTENT_HINT = t.VideoFormat = t.AUDIO_SCENARIO_TYPE = t.AUDIO_PROFILE_TYPE = t.AUDIO_AINS_MODE = t.EXPERIENCE_POOR_REASON = t.EXPERIENCE_QUALITY_TYPE = t.ClientRoleOptions = t.AUDIENCE_LATENCY_LEVEL_TYPE = void 0, t.EAR_MONITORING_FILTER_TYPE = t.UserInfo = t.EchoTestConfiguration = t.STREAM_PUBLISH_STATE = t.STREAM_SUBSCRIBE_STATE = t.PERMISSION_TYPE = t.UPLOAD_ERROR_REASON = t.ENCRYPTION_ERROR_TYPE = t.EncryptionConfig = t.ENCRYPTION_MODE = t.DownlinkNetworkInfo = t.PeerDownlinkInfo = t.UplinkNetworkInfo = t.ChannelMediaRelayConfiguration = t.ChannelMediaInfo = t.CHANNEL_MEDIA_RELAY_STATE = t.CHANNEL_MEDIA_RELAY_ERROR = t.AREA_CODE_EX = t.AREA_CODE = t.AudioEncodedFrameObserverConfig = t.AudioRecordingConfiguration = t.AUDIO_ENCODED_FRAME_OBSERVER_POSITION = t.AUDIO_FILE_RECORDING_TYPE = t.AUDIO_RECORDING_QUALITY_TYPE = t.ScreenCaptureParameters = t.HEADPHONE_EQUALIZER_PRESET = t.VOICE_CONVERSION_PRESET = t.AUDIO_EFFECT_PRESET = t.VOICE_BEAUTIFIER_PRESET = t.AudioTrackConfig = t.AUDIO_TRACK_TYPE = t.SegmentationProperty = t.SEG_MODEL_TYPE = t.VirtualBackgroundSource = t.BACKGROUND_BLUR_DEGREE = t.BACKGROUND_SOURCE_TYPE = t.ColorEnhanceOptions = t.VideoDenoiserOptions = t.VIDEO_DENOISER_LEVEL = t.VIDEO_DENOISER_MODE = t.LowlightEnhanceOptions = t.LOW_LIGHT_ENHANCE_LEVEL = t.LOW_LIGHT_ENHANCE_MODE = t.BeautyOptions = t.LIGHTENING_CONTRAST_LEVEL = t.VideoCanvas = t.VIDEO_VIEW_SETUP_MODE = t.NETWORK_TYPE = t.WlAccStats = t.WLACC_SUGGEST_ACTION = void 0, t.VideoLayout = t.SpatialAudioParams = t.RecorderStreamInfo = t.LocalAccessPointConfiguration = t.AdvancedConfigInfo = t.LogUploadServerInfo = t.LOCAL_PROXY_MODE = t.CONFIG_FETCH_TYPE = t.VideoRenderingTracingInfo = t.MEDIA_TRACE_EVENT = t.ScreenCaptureParameters2 = t.ScreenAudioParameters = t.ScreenVideoParameters = t.THREAD_PRIORITY_TYPE = void 0, function (e) { e[e.CHANNEL_PROFILE_COMMUNICATION = 0] = "CHANNEL_PROFILE_COMMUNICATION", e[e.CHANNEL_PROFILE_LIVE_BROADCASTING = 1] = "CHANNEL_PROFILE_LIVE_BROADCASTING", e[e.CHANNEL_PROFILE_GAME = 2] = "CHANNEL_PROFILE_GAME", e[e.CHANNEL_PROFILE_CLOUD_GAMING = 3] = "CHANNEL_PROFILE_CLOUD_GAMING", e[e.CHANNEL_PROFILE_COMMUNICATION_1v1 = 4] = "CHANNEL_PROFILE_COMMUNICATION_1v1" }(n || (t.CHANNEL_PROFILE_TYPE = n = {})), function (e) { e[e.W        }, t = {}; function n(i) { var r = t[i]; if (void 0 !== r) return r.exports; var o = t[i] = { exports: {} }; return e[i].call(o.exports, o, o.exports, n), o.exports } return n.g = function () { if ("object" == typeof globalThis) return globalThis; try { return this || new Function("return this")() } catch (e) { if ("object" == typeof window) return window } }(), n(5352)
    }()
}
http://requirejs.org/docs/errors.html#mismatch
    at makeError (require.js:168:17)
    at intakeDefines (require.js:1254:36)
    at Object.localRequire [as require] (require.js:1446:21)
    at requirejs (require.js:1797:24)
    at req.config (require.js:1805:16)
    at main_module.bootstrap.js:3:9

Code sample

Code sample
import 'dart:async';

import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

const appId = "";
const token = "";
const channel = "";

void main() => runApp(const MaterialApp(home: MyApp()));

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int? _remoteUid;
  bool _localUserJoined = false;
  late RtcEngine _engine;

  @override
  void initState() {
    super.initState();
    initAgora();
  }

  Future<void> initAgora() async {
    // retrieve permissions
    await [Permission.microphone, Permission.camera].request();

    //create the engine
    _engine = createAgoraRtcEngine();
    await _engine.initialize(const RtcEngineContext(
      appId: appId,
      channelProfile: ChannelProfileType.channelProfileLiveBroadcasting,
    ));

    _engine.registerEventHandler(
      RtcEngineEventHandler(
        onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
          debugPrint("local user ${connection.localUid} joined");
          setState(() {
            _localUserJoined = true;
          });
        },
        onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) {
          debugPrint("remote user $remoteUid joined");
          setState(() {
            _remoteUid = remoteUid;
          });
        },
        onUserOffline: (RtcConnection connection, int remoteUid,
            UserOfflineReasonType reason) {
          debugPrint("remote user $remoteUid left channel");
          setState(() {
            _remoteUid = null;
          });
        },
        onTokenPrivilegeWillExpire: (RtcConnection connection, String token) {
          debugPrint(
              '[onTokenPrivilegeWillExpire] connection: ${connection.toJson()}, token: $token');
        },
      ),
    );

    await _engine.setClientRole(role: ClientRoleType.clientRoleBroadcaster);
    await _engine.enableVideo();
    await _engine.startPreview();

    await _engine.joinChannel(
      token: token,
      channelId: channel,
      uid: 0,
      options: const ChannelMediaOptions(),
    );
  }

  @override
  void dispose() {
    super.dispose();

    _dispose();
  }

  Future<void> _dispose() async {
    await _engine.leaveChannel();
    await _engine.release();
  }

  // Create UI with local view and remote view
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Agora Video Call'),
      ),
      body: Stack(
        children: [
          Center(
            child: _remoteVideo(),
          ),
          Align(
            alignment: Alignment.topLeft,
            child: SizedBox(
              width: 100,
              height: 150,
              child: Center(
                child: _localUserJoined
                    ? AgoraVideoView(
                        controller: VideoViewController(
                          rtcEngine: _engine,
                          canvas: const VideoCanvas(uid: 0),
                        ),
                      )
                    : const CircularProgressIndicator(),
              ),
            ),
          ),
        ],
      ),
    );
  }

  // Display remote user's video
  Widget _remoteVideo() {
    if (_remoteUid != null) {
      return AgoraVideoView(
        controller: VideoViewController.remote(
          rtcEngine: _engine,
          canvas: VideoCanvas(uid: _remoteUid),
          connection: const RtcConnection(channelId: channel),
        ),
      );
    } else {
      return const Text(
        'Please wait for remote user to join',
        textAlign: TextAlign.center,
      );
    }
  }
}

<!DOCTYPE html>
<html>

<head>
  <!--
    If you are serving your web app in a path other than the root, change the
    href value below to reflect the base path you are serving from.

    The path provided below has to start and end with a slash "/" in order for
    it to work correctly.

    For more details:
    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base

    This is a placeholder for base href that will be replaced by the value of
    the `--base-href` argument provided to `flutter build`.
  -->
  <base href="$FLUTTER_BASE_HREF">

  <meta charset="UTF-8">
  <meta content="IE=Edge" http-equiv="X-UA-Compatible">
  <meta name="description" content="A new Flutter project.">

  <!-- iOS meta tags & icons -->
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="apple-mobile-web-app-title" content="agora_test_next_version">
  <link rel="apple-touch-icon" href="icons/Icon-192.png">

  <!-- Favicon -->
  <link rel="icon" type="image/png" href="favicon.png" />

  <title>agora_test_next_version</title>
  <link rel="manifest" href="manifest.json">
</head>

<body>
  <script src="flutter_bootstrap.js" async></script>
  <script src="iris-web-rtc_n430_w4200_0.7.0.js"></script>

</body>

</html>

Screenshots or Video

Screenshots / Video demonstration

[Upload media here]

Logs

Logs
[Paste your logs here]

Flutter Doctor output

Doctor output
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.22.1, on Ubuntu 23.10 6.5.7-060507-generic,
    locale en_US.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio (version 2023.1)
[✓] VS Code (version 1.89.1)
[✓] Connected device (3 available)
[✓] Network resources

• No issues found!

Silfalion avatar May 29 '24 18:05 Silfalion