This commit is contained in:
kodjomoustapha 2024-02-08 20:39:35 +01:00
parent fc2e80f31e
commit a086e918b6
24 changed files with 264 additions and 47 deletions

View file

@ -36,6 +36,9 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
'supportsLatest': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)),
)),
'baseUrl': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string),
nullable: true))),
},
methods: {
'getLatestUpdates': BridgeMethodDef(BridgeFunctionDef(
@ -936,6 +939,9 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
@override
bool get supportsLatest => $_get('supportsLatest');
@override
String? get baseUrl => $_get('baseUrl');
@override
Future<MManga> getDetail(String url) async =>
await $_invoke('getDetail', [$String(url)]);

View file

@ -8,6 +8,8 @@ abstract class MProvider {
bool get supportsLatest => true;
String? get baseUrl;
Future<MPages> getLatestUpdates(int page);
Future<MPages> getPopular(int page);

View file

@ -54,7 +54,7 @@ class Source {
String? additionalParams;
Source(
{this.id = 1,
{this.id = 0,
this.name = '',
this.baseUrl = '',
this.lang = '',

View file

@ -3,17 +3,18 @@ import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/fetch_manga_sources.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:http/http.dart' as http;
part 'fetch_anime_sources.g.dart';
@riverpod
Future fetchAnimeSourcesList(FetchAnimeSourcesListRef ref,
{int? id, required bool reFresh}) async {
final http = MInterceptor.init();
if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) {
final info = await PackageInfo.fromPlatform();
final req = await http.get(Uri.parse(
final req = await MInterceptor.init().get(Uri.parse(
"https://kodjodevf.github.io/mangayomi-extensions/anime_index.json"));
final res = jsonDecode(req.body) as List;

View file

@ -7,7 +7,7 @@ part of 'fetch_anime_sources.dart';
// **************************************************************************
String _$fetchAnimeSourcesListHash() =>
r'3f9cf47efce8e6e207c59e0d936727959c1fe982';
r'0978d9a13fa5d0a13be2ade237afa37897dd251b';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -5,14 +5,15 @@ import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:http/http.dart' as http;
part 'fetch_manga_sources.g.dart';
@riverpod
Future fetchMangaSourcesList(FetchMangaSourcesListRef ref,
{int? id, required reFresh}) async {
final http = MInterceptor.init();
if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) {
final info = await PackageInfo.fromPlatform();
final req = await http.get(Uri.parse(

View file

@ -7,7 +7,7 @@ part of 'fetch_manga_sources.dart';
// **************************************************************************
String _$fetchMangaSourcesListHash() =>
r'a74557098c49877942a296abe110fb6ef1dce580';
r'd5e159297c52465b30b2a2f7c6fd13f22778d218';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -24,6 +24,7 @@ import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provi
import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart';
import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/get_source_baseurl.dart';
import 'package:mangayomi/sources/utils/utils.dart';
import 'package:mangayomi/utils/cached_network.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
@ -1534,10 +1535,13 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
elevation: 0),
onPressed: () {
final manga = widget.manga!;
final source =
getSource(widget.manga!.lang!, widget.manga!.source!)!;
final baseUrl =
ref.watch(sourceBaseUrlProvider(source: source));
String url = widget.manga!.link!.startsWith('/')
? "${source.baseUrl}${widget.manga!.link!}"
? "$baseUrl${widget.manga!.link!}"
: widget.manga!.link!;
Map<String, dynamic> data = {

View file

@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$updateMangaDetailHash() => r'950a994c59fea3451e6bced24d50d27b65f4b605';
String _$updateMangaDetailHash() => r'7733551fd578f5d093c4ca11427015a3f3af415a';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -11,6 +11,7 @@ import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/get_filter_list.dart';
import 'package:mangayomi/services/get_latest_updates.dart';
import 'package:mangayomi/services/get_popular.dart';
import 'package:mangayomi/services/get_source_baseurl.dart';
import 'package:mangayomi/services/search.dart';
import 'package:mangayomi/services/supports_latest.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
@ -67,26 +68,25 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
}
Future<MPages?> _loadMore() async {
MPages? mangaResList;
MPages? mangaRes;
if (_isLoading) {
if (widget.source.isFullData!) {
await Future.delayed(const Duration(milliseconds: 500));
_fullDataLength = _fullDataLength + 50;
} else {
if (_selectedIndex == 0 && !_isSearch && _query.isEmpty) {
mangaResList = await ref.watch(getPopularProvider(
mangaRes = await ref.watch(getPopularProvider(
source: widget.source,
page: _page + 1,
).future);
} else if (_selectedIndex == 1 && !_isSearch && _query.isEmpty) {
mangaResList = await ref.watch(getLatestUpdatesProvider(
mangaRes = await ref.watch(getLatestUpdatesProvider(
source: widget.source,
page: _page + 1,
).future);
} else if (_selectedIndex == 2 && (_isSearch && _query.isNotEmpty) ||
_isFiltering) {
mangaResList = await ref.watch(searchProvider(
mangaRes = await ref.watch(searchProvider(
source: widget.source,
query: _query,
page: _page + 1,
@ -94,14 +94,17 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
.future);
}
}
if (mounted) {
setState(() {
_page = _page + 1;
_hasNextPage = mangaResList!.hasNextPage;
});
if (mangaRes!.list.isNotEmpty) {
if (mounted) {
setState(() {
_page = _page + 1;
_hasNextPage = mangaRes!.hasNextPage;
});
}
}
}
return mangaResList;
return mangaRes;
}
late final _textEditingController = TextEditingController(text: widget.query);
@ -181,8 +184,10 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
Icon(Icons.search, color: Theme.of(context).hintColor)),
IconButton(
onPressed: () {
final baseUrl =
ref.watch(sourceBaseUrlProvider(source: widget.source));
Map<String, dynamic> data = {
'url': widget.source.baseUrl!,
'url': baseUrl,
'sourceId': widget.source.id.toString(),
'title': '',
"hasCloudFlare": widget.source.hasCloudflare ?? false
@ -475,8 +480,10 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
children: [
IconButton(
onPressed: () {
final baseUrl = ref.watch(
sourceBaseUrlProvider(source: widget.source));
Map<String, dynamic> data = {
'url': widget.source.baseUrl!,
'url': baseUrl,
'sourceId': widget.source.id.toString(),
'title': '',
"hasCloudFlare":

View file

@ -2,9 +2,9 @@ import 'dart:convert';
import 'dart:developer';
import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:mangayomi/modules/browse/extension/providers/fetch_manga_sources.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
@ -76,6 +76,7 @@ Future<void> _launchInBrowser(Uri url) async {
}
Future<(String, String, String)> _checkUpdate() async {
final http = MInterceptor.init();
try {
final res = await http.get(Uri.parse(
"https://api.github.com/repos/kodjodevf/Mangayomi/releases?page=1&per_page=10"));

View file

@ -1,12 +1,12 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'aniskip.g.dart';
// credits: https://github.com/aniyomiorg/aniyomi/blob/master/app/src/main/java/eu/kanade/tachiyomi/util/AniSkipApi.kt
@riverpod
class AniSkip extends _$AniSkip {
final _client = http.Client();
final http = MInterceptor.init();
@override
void build() {}
@ -17,7 +17,7 @@ class AniSkip extends _$AniSkip {
final url =
"https://api.aniskip.com/v2/skip-times/$malId/$episodeNumber?types[]=ed&types[]=mixed-ed&types[]=mixed-op&types[]=op&types[]=recap&episodeLength=$episodeLength";
final response = await _client.get(Uri.parse(url));
final response = await http.get(Uri.parse(url));
final res = AniSkipResponse.fromJson(json.decode(response.body));
return (res.found ?? false) ? res.results : null;
@ -35,7 +35,7 @@ class AniSkip extends _$AniSkip {
Media(id:${id.$1}){idMal}
}
""";
final response = await _client.post(
final response = await http.post(
Uri.parse("https://graphql.anilist.co"),
body: json.encode({"query": query}),
headers: {"Content-Type": "application/json"},

View file

@ -6,7 +6,7 @@ part of 'aniskip.dart';
// RiverpodGenerator
// **************************************************************************
String _$aniSkipHash() => r'58cfba5bb87e0a5f34009391a204d99bf773c858';
String _$aniSkipHash() => r'bd921f6bbeebd61d17644a6efd4e5960330ba17b';
/// See also [AniSkip].
@ProviderFor(AniSkip)

View file

@ -0,0 +1,31 @@
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/sources/source_test.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'get_source_baseurl.g.dart';
@riverpod
String sourceBaseUrl(SourceBaseUrlRef ref, {required Source source}) {
String? baseUrl;
try {
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
baseUrl = (res as MProvider).baseUrl;
} catch (e) {
baseUrl = source.baseUrl;
}
if (baseUrl == null || baseUrl.isEmpty) {
baseUrl = source.baseUrl;
}
return baseUrl!;
}

View file

@ -0,0 +1,158 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'get_source_baseurl.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$sourceBaseUrlHash() => r'232addc3559f2b77974224a5ed8813eee9a0ba8e';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [sourceBaseUrl].
@ProviderFor(sourceBaseUrl)
const sourceBaseUrlProvider = SourceBaseUrlFamily();
/// See also [sourceBaseUrl].
class SourceBaseUrlFamily extends Family<String> {
/// See also [sourceBaseUrl].
const SourceBaseUrlFamily();
/// See also [sourceBaseUrl].
SourceBaseUrlProvider call({
required Source source,
}) {
return SourceBaseUrlProvider(
source: source,
);
}
@override
SourceBaseUrlProvider getProviderOverride(
covariant SourceBaseUrlProvider provider,
) {
return call(
source: provider.source,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'sourceBaseUrlProvider';
}
/// See also [sourceBaseUrl].
class SourceBaseUrlProvider extends AutoDisposeProvider<String> {
/// See also [sourceBaseUrl].
SourceBaseUrlProvider({
required Source source,
}) : this._internal(
(ref) => sourceBaseUrl(
ref as SourceBaseUrlRef,
source: source,
),
from: sourceBaseUrlProvider,
name: r'sourceBaseUrlProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$sourceBaseUrlHash,
dependencies: SourceBaseUrlFamily._dependencies,
allTransitiveDependencies:
SourceBaseUrlFamily._allTransitiveDependencies,
source: source,
);
SourceBaseUrlProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.source,
}) : super.internal();
final Source source;
@override
Override overrideWith(
String Function(SourceBaseUrlRef provider) create,
) {
return ProviderOverride(
origin: this,
override: SourceBaseUrlProvider._internal(
(ref) => create(ref as SourceBaseUrlRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
source: source,
),
);
}
@override
AutoDisposeProviderElement<String> createElement() {
return _SourceBaseUrlProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SourceBaseUrlProvider && other.source == source;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, source.hashCode);
return _SystemHash.finish(hash);
}
}
mixin SourceBaseUrlRef on AutoDisposeProviderRef<String> {
/// The parameter `source` of this provider.
Source get source;
}
class _SourceBaseUrlProviderElement extends AutoDisposeProviderElement<String>
with SourceBaseUrlRef {
_SourceBaseUrlProviderElement(super.provider);
@override
Source get source => (origin as SourceBaseUrlProvider).source;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

View file

@ -2,17 +2,19 @@ import 'dart:convert';
import 'dart:io';
import 'dart:isolate';
import 'package:flutter/services.dart';
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:http/http.dart' as http;
import 'package:mangayomi/ffi/torrent_server_ffi.dart' as libmtorrentserver_ffi;
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'torrent_server.g.dart';
class MTorrentServer {
final http = MInterceptor.init();
Future<bool> removeTorrent(String? inforHash) async {
if (inforHash == null || inforHash.isEmpty) return false;
try {
@ -44,11 +46,11 @@ class MTorrentServer {
try {
final torrentByte = (await http.get(Uri.parse(url))).bodyBytes;
var request =
http.MultipartRequest('POST', Uri.parse('$_baseUrl/torrent/add'));
MultipartRequest('POST', Uri.parse('$_baseUrl/torrent/add'));
request.files.add(http.MultipartFile.fromBytes('file', torrentByte,
request.files.add(MultipartFile.fromBytes('file', torrentByte,
filename: 'file.torrent'));
http.StreamedResponse response = await request.send();
StreamedResponse response = await request.send();
return await response.stream.bytesToString();
} catch (e) {
rethrow;

View file

@ -1,6 +1,5 @@
import 'dart:io';
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
import 'package:http/http.dart' as http;
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/track.dart';
@ -9,11 +8,13 @@ import 'dart:convert';
import 'package:mangayomi/models/track_search.dart';
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'anilist.g.dart';
@riverpod
class Anilist extends _$Anilist {
final http = MInterceptor.init();
final String _clientId =
(Platform.isWindows || Platform.isLinux) ? '13587' : '13588';
static const String _baseApiUrl = "https://graphql.anilist.co/";

View file

@ -6,7 +6,7 @@ part of 'anilist.dart';
// RiverpodGenerator
// **************************************************************************
String _$anilistHash() => r'ee83d9fc6e85366bb7cbce876b0878207829a979';
String _$anilistHash() => r'afd6de461493a0f7a658e5f9d33bffc9d51c1f6d';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,5 +1,5 @@
import 'dart:developer';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:intl/intl.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/models/track.dart';
@ -8,11 +8,13 @@ import 'dart:convert';
import 'package:mangayomi/models/track_search.dart';
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'kitsu.g.dart';
@riverpod
class Kitsu extends _$Kitsu {
final http = MInterceptor.init();
final String _clientId =
'dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd';
final String _clientSecret =
@ -41,7 +43,7 @@ class Kitsu extends _$Kitsu {
Future<(bool, String)> login(String username, String password) async {
try {
final request = http.MultipartRequest('POST', Uri.parse(_loginUrl));
final request = MultipartRequest('POST', Uri.parse(_loginUrl));
request.fields.addAll({
'username': username,
'password': password,

View file

@ -6,7 +6,7 @@ part of 'kitsu.dart';
// RiverpodGenerator
// **************************************************************************
String _$kitsuHash() => r'425a6699eafe84e35320c9a66bce33b4ba332a52';
String _$kitsuHash() => r'c8ceccec70441eefe0c4a94c901adaaa5009cff3';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -2,18 +2,20 @@ import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:intl/intl.dart';
import 'package:mangayomi/models/track.dart';
import 'package:mangayomi/models/track_preference.dart';
import 'package:mangayomi/models/track_search.dart';
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'myanimelist.g.dart';
@riverpod
class MyAnimeList extends _$MyAnimeList {
final http = MInterceptor.init();
String baseOAuthUrl = 'https://myanimelist.net/v1/oauth2';
String baseApiUrl = 'https://api.myanimelist.net/v2';
String codeVerifier = "";
@ -312,11 +314,11 @@ class MyAnimeList extends _$MyAnimeList {
if (track.finishedReadingDate != null)
'finish_date': _convertToIsoDate(track.finishedReadingDate)
};
final request = http.Request(
final request = Request(
'PUT', Uri.parse('$baseApiUrl/anime/${track.mediaId}/my_list_status'));
request.bodyFields = formBody;
request.headers.addAll({'Authorization': 'Bearer $accessToken'});
final response = await http.Client().send(request);
final response = await Client().send(request);
final mJson = jsonDecode(await response.stream.bytesToString());
return _parseAnimeItem(mJson, track);
}
@ -334,11 +336,11 @@ class MyAnimeList extends _$MyAnimeList {
if (track.finishedReadingDate != null)
'finish_date': _convertToIsoDate(track.finishedReadingDate)
};
final request = http.Request(
final request = Request(
'PUT', Uri.parse('$baseApiUrl/manga/${track.mediaId}/my_list_status'));
request.bodyFields = formBody;
request.headers.addAll({'Authorization': 'Bearer $accessToken'});
final response = await http.Client().send(request);
final response = await Client().send(request);
final mJson = jsonDecode(await response.stream.bytesToString());
return _parseMangaItem(mJson, track);
}

View file

@ -6,7 +6,7 @@ part of 'myanimelist.dart';
// RiverpodGenerator
// **************************************************************************
String _$myAnimeListHash() => r'bdbe57c0071039f20aa929fc9f320f130b4a4ae3';
String _$myAnimeListHash() => r'0213cf673c21b2c164cbac3b86de196335daebf7';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -623,7 +623,7 @@ packages:
source: hosted
version: "0.15.4"
http:
dependency: "direct main"
dependency: "direct overridden"
description:
name: http
sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
@ -642,10 +642,10 @@ packages:
dependency: "direct main"
description:
name: http_interceptor
sha256: "7fe0863f734dcc8286875d2f074f8dd91c47fef95cd219b34282d71930a4895f"
sha256: fc7eedc62433c17612bf65237a8aa2615553cc9130f1e4d75f7e5fa364d5232e
url: "https://pub.dev"
source: hosted
version: "2.0.0-beta.7"
version: "2.0.0-beta.8"
http_multi_server:
dependency: transitive
description:

View file

@ -66,8 +66,7 @@ dependencies:
window_manager: ^0.3.8
ffi: ^2.1.0
ffigen: ^11.0.0
http_interceptor: ^2.0.0-beta.7
http: ^1.2.0
http_interceptor: ^2.0.0-beta.8
flutter_windows_webview:
git:
url: https://github.com/wgh136/flutter_windows_webview