From 90bb67044251828df5899121e001fd56a97419ae Mon Sep 17 00:00:00 2001 From: chen08209 Date: Sun, 16 Jun 2024 19:04:33 +0800 Subject: [PATCH] Fix flashback caused by process --- .../kotlin/com/follow/clash/GlobalState.kt | 1 + .../com/follow/clash/plugins/ProxyPlugin.kt | 7 + core/common.go | 10 +- core/dart-bridge/message.go | 16 +- core/platform/limit.go | 42 --- core/platform/procfs.go | 171 ---------- core/process.go | 48 +-- core/tun.go | 31 +- lib/clash/message.dart | 5 + lib/enum/enum.dart | 2 +- lib/fragments/config.dart | 48 ++- lib/main.dart | 40 ++- lib/models/ffi.dart | 2 +- lib/models/generated/ffi.freezed.dart | 29 +- lib/models/generated/ffi.g.dart | 3 +- lib/plugins/proxy.dart | 17 +- lib/widgets/clash_message_container.dart | 9 +- pubspec.lock | 292 +++++++++--------- pubspec.yaml | 2 +- 19 files changed, 316 insertions(+), 459 deletions(-) delete mode 100644 core/platform/limit.go delete mode 100644 core/platform/procfs.go diff --git a/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt b/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt index eb71d3a..9ad6611 100644 --- a/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt +++ b/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt @@ -15,6 +15,7 @@ enum class RunState { class GlobalState { companion object { val runState: MutableLiveData = MutableLiveData(RunState.STOP) + var runTime: Date? = null var flutterEngine: FlutterEngine? = null fun getCurrentTilePlugin(): TilePlugin? = flutterEngine?.plugins?.get(TilePlugin::class.java) as TilePlugin? diff --git a/android/app/src/main/kotlin/com/follow/clash/plugins/ProxyPlugin.kt b/android/app/src/main/kotlin/com/follow/clash/plugins/ProxyPlugin.kt index 9c103c4..4e3444f 100644 --- a/android/app/src/main/kotlin/com/follow/clash/plugins/ProxyPlugin.kt +++ b/android/app/src/main/kotlin/com/follow/clash/plugins/ProxyPlugin.kt @@ -25,6 +25,7 @@ import io.flutter.embedding.engine.plugins.activity.ActivityAware import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel +import java.util.Date class ProxyPlugin : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAware { @@ -93,6 +94,10 @@ class ProxyPlugin : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAwar } } + "GetRunTimeStamp" -> { + result.success(GlobalState.runTime?.time) + } + "startForeground" -> { title = call.argument("title") as String content = call.argument("content") as String @@ -118,6 +123,7 @@ class ProxyPlugin : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAwar if (GlobalState.runState.value == RunState.START) return; flClashVpnService?.start(port, props) GlobalState.runState.value = RunState.START + GlobalState.runTime = Date() startAfter() } @@ -126,6 +132,7 @@ class ProxyPlugin : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAwar flClashVpnService?.stop() unbindService() GlobalState.runState.value = RunState.STOP; + GlobalState.runTime = null; } @SuppressLint("ForegroundServiceType") diff --git a/core/common.go b/core/common.go index 01518a5..a551486 100644 --- a/core/common.go +++ b/core/common.go @@ -82,13 +82,13 @@ type Delay struct { } type Process struct { - Id int64 `json:"id"` - Metadata constant.Metadata `json:"metadata"` + Id int64 `json:"id"` + Metadata *constant.Metadata `json:"metadata"` } type ProcessMapItem struct { - Id int64 `json:"id"` - Value *string `json:"value"` + Id int64 `json:"id"` + Value string `json:"value"` } type Now struct { @@ -396,8 +396,6 @@ func applyConfig(isPatch bool) { if isPatch { patchConfig(cfg.General) } else { - runtime.GC() - executor.Shutdown() hub.UltraApplyConfig(cfg, true) } } diff --git a/core/dart-bridge/message.go b/core/dart-bridge/message.go index 66d424e..3ccd77a 100644 --- a/core/dart-bridge/message.go +++ b/core/dart-bridge/message.go @@ -13,6 +13,7 @@ const ( Now MessageType = "now" Process MessageType = "process" Request MessageType = "request" + Run MessageType = "run" ) type Message struct { @@ -20,11 +21,18 @@ type Message struct { Data interface{} `json:"data"` } -func (message *Message) Json() string { - data, _ := json.Marshal(message) - return string(data) +func (message *Message) Json() (string, error) { + data, err := json.Marshal(message) + return string(data), err } func SendMessage(message Message) { - SendToPort(*Port, message.Json()) + if Port == nil { + return + } + s, err := message.Json() + if err != nil { + return + } + SendToPort(*Port, s) } diff --git a/core/platform/limit.go b/core/platform/limit.go deleted file mode 100644 index 0f3e24a..0000000 --- a/core/platform/limit.go +++ /dev/null @@ -1,42 +0,0 @@ -//go:build android - -package platform - -import "syscall" - -var nullFd int -var maxFdCount int - -func init() { - fd, err := syscall.Open("/dev/null", syscall.O_WRONLY, 0644) - if err != nil { - panic(err.Error()) - } - - nullFd = fd - - var limit syscall.Rlimit - - if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - maxFdCount = 1024 - } else { - maxFdCount = int(limit.Cur) - } - - maxFdCount = maxFdCount / 4 * 3 -} - -func ShouldBlockConnection() bool { - fd, err := syscall.Dup(nullFd) - if err != nil { - return true - } - - _ = syscall.Close(fd) - - if fd > maxFdCount { - return true - } - - return false -} diff --git a/core/platform/procfs.go b/core/platform/procfs.go deleted file mode 100644 index 51f4217..0000000 --- a/core/platform/procfs.go +++ /dev/null @@ -1,171 +0,0 @@ -//go:build android - -package platform - -import ( - "bufio" - "encoding/binary" - "encoding/hex" - "fmt" - "net" - "os" - "strconv" - "strings" - "unsafe" -) - -var netIndexOfLocal = -1 -var netIndexOfUid = -1 - -var nativeEndian binary.ByteOrder - -func QuerySocketUidFromProcFs(source, _ net.Addr) int { - if netIndexOfLocal < 0 || netIndexOfUid < 0 { - return -1 - } - - network := source.Network() - - if strings.HasSuffix(network, "4") || strings.HasSuffix(network, "6") { - network = network[:len(network)-1] - } - - path := "/proc/net/" + network - - var sIP net.IP - var sPort int - - switch s := source.(type) { - case *net.TCPAddr: - sIP = s.IP - sPort = s.Port - case *net.UDPAddr: - sIP = s.IP - sPort = s.Port - default: - return -1 - } - - sIP = sIP.To16() - if sIP == nil { - return -1 - } - - uid := doQuery(path+"6", sIP, sPort) - if uid == -1 { - sIP = sIP.To4() - if sIP == nil { - return -1 - } - uid = doQuery(path, sIP, sPort) - } - - return uid -} - -func doQuery(path string, sIP net.IP, sPort int) int { - file, err := os.Open(path) - if err != nil { - return -1 - } - - defer file.Close() - - reader := bufio.NewReader(file) - - var bytes [2]byte - - binary.BigEndian.PutUint16(bytes[:], uint16(sPort)) - - local := fmt.Sprintf("%s:%s", hex.EncodeToString(nativeEndianIP(sIP)), hex.EncodeToString(bytes[:])) - - for { - row, _, err := reader.ReadLine() - if err != nil { - return -1 - } - - fields := strings.Fields(string(row)) - - if len(fields) <= netIndexOfLocal || len(fields) <= netIndexOfUid { - continue - } - - if strings.EqualFold(local, fields[netIndexOfLocal]) { - uid, err := strconv.Atoi(fields[netIndexOfUid]) - if err != nil { - return -1 - } - - return uid - } - } -} - -func nativeEndianIP(ip net.IP) []byte { - result := make([]byte, len(ip)) - - for i := 0; i < len(ip); i += 4 { - value := binary.BigEndian.Uint32(ip[i:]) - - nativeEndian.PutUint32(result[i:], value) - } - - return result -} - -func init() { - file, err := os.Open("/proc/net/tcp") - if err != nil { - return - } - - defer file.Close() - - reader := bufio.NewReader(file) - - header, _, err := reader.ReadLine() - if err != nil { - return - } - - columns := strings.Fields(string(header)) - - var txQueue, rxQueue, tr, tmWhen bool - - for idx, col := range columns { - offset := 0 - - if txQueue && rxQueue { - offset-- - } - - if tr && tmWhen { - offset-- - } - - switch col { - case "tx_queue": - txQueue = true - case "rx_queue": - rxQueue = true - case "tr": - tr = true - case "tm->when": - tmWhen = true - case "local_address": - netIndexOfLocal = idx + offset - case "uid": - netIndexOfUid = idx + offset - } - } -} - -func init() { - var x uint32 = 0x01020304 - if *(*byte)(unsafe.Pointer(&x)) == 0x01 { - nativeEndian = binary.BigEndian - } else { - nativeEndian = binary.LittleEndian - } -} diff --git a/core/process.go b/core/process.go index 98b498b..b9d33d6 100644 --- a/core/process.go +++ b/core/process.go @@ -9,16 +9,30 @@ import ( "errors" "github.com/metacubex/mihomo/component/process" "github.com/metacubex/mihomo/constant" - "github.com/metacubex/mihomo/log" + "sync" "sync/atomic" "time" ) -var ( - counter int64 -) +type ProcessMap struct { + m sync.Map +} -var processMap = make(map[int64]*string) +func (cm *ProcessMap) Store(key int64, value string) { + cm.m.Store(key, value) +} + +func (cm *ProcessMap) Load(key int64) (string, bool) { + value, ok := cm.m.Load(key) + if !ok || value == nil { + return "", false + } + return value.(string), true +} + +var counter int64 = 0 + +var processMap ProcessMap func init() { process.DefaultPackageNameResolver = func(metadata *constant.Metadata) (string, error) { @@ -29,31 +43,24 @@ func init() { timeout := time.After(200 * time.Millisecond) - message := &bridge.Message{ + bridge.SendMessage(bridge.Message{ Type: bridge.Process, Data: Process{ Id: id, - Metadata: *metadata, + Metadata: metadata, }, - } - - bridge.SendMessage(*message) + }) for { select { case <-timeout: return "", errors.New("package resolver timeout") default: - value, exists := processMap[counter] + value, exists := processMap.Load(id) if exists { - if value != nil { - log.Infoln("[PKG] %s --> %s by [%s]", metadata.SourceAddress(), metadata.RemoteAddress(), *value) - return *value, nil - } else { - return "", process.ErrInvalidNetwork - } + return value, nil } - time.Sleep(10 * time.Millisecond) + time.Sleep(20 * time.Millisecond) } } } @@ -61,12 +68,15 @@ func init() { //export setProcessMap func setProcessMap(s *C.char) { + if s == nil { + return + } go func() { paramsString := C.GoString(s) var processMapItem = &ProcessMapItem{} err := json.Unmarshal([]byte(paramsString), processMapItem) if err == nil { - processMap[processMapItem.Id] = processMapItem.Value + processMap.Store(processMapItem.Id, processMapItem.Value) } }() } diff --git a/core/tun.go b/core/tun.go index ff1677b..2c7caab 100644 --- a/core/tun.go +++ b/core/tun.go @@ -4,13 +4,10 @@ package main import "C" import ( - "core/platform" t "core/tun" - "errors" "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/log" "golang.org/x/sync/semaphore" - "strconv" "sync" "syscall" "time" @@ -18,16 +15,11 @@ import ( var tunLock sync.Mutex var tun *t.Tun -var runTime *time.Time //export startTUN func startTUN(fd C.int) { - tunLock.Lock() - - now := time.Now() - runTime = &now - go func() { + tunLock.Lock() defer tunLock.Unlock() if tun != nil { @@ -43,6 +35,8 @@ func startTUN(fd C.int) { closer, err := t.Start(f, gateway, portal, dns) + applyConfig(true) + if err != nil { log.Errorln("startTUN error: %v", err) tempTun.Close() @@ -51,30 +45,18 @@ func startTUN(fd C.int) { tempTun.Closer = closer tun = tempTun - - applyConfig(true) }() } -//export getRunTime -func getRunTime() *C.char { - if runTime == nil { - return C.CString("") - } - return C.CString(strconv.FormatInt(runTime.UnixMilli(), 10)) -} - //export stopTun func stopTun() { - tunLock.Lock() - - runTime = nil - go func() { + tunLock.Lock() defer tunLock.Unlock() if tun != nil { tun.Close() + applyConfig(true) tun = nil } }() @@ -82,9 +64,6 @@ func stopTun() { func init() { dialer.DefaultSocketHook = func(network, address string, conn syscall.RawConn) error { - if platform.ShouldBlockConnection() { - return errors.New("blocked") - } return conn.Control(func(fd uintptr) { if tun != nil { tun.MarkSocket(int(fd)) diff --git a/lib/clash/message.dart b/lib/clash/message.dart index 8ba6387..14ee711 100644 --- a/lib/clash/message.dart +++ b/lib/clash/message.dart @@ -19,6 +19,8 @@ abstract mixin class ClashMessageListener { void onRequest(Connection connection) {} void onNow(Now now) {} + + void onRun(String runTime) {} } class ClashMessage { @@ -51,6 +53,9 @@ class ClashMessage { case MessageType.request: listener.onRequest(Connection.fromJson(m.data)); break; + case MessageType.run: + listener.onRun(m.data); + break; } } }); diff --git a/lib/enum/enum.dart b/lib/enum/enum.dart index 2d9006c..9e4d4e1 100644 --- a/lib/enum/enum.dart +++ b/lib/enum/enum.dart @@ -56,7 +56,7 @@ enum ProfileType { file, url } enum ResultType { success, error } -enum MessageType { log, tun, delay, process, now, request } +enum MessageType { log, tun, delay, process, now, request, run } enum FindProcessMode { always, off } diff --git a/lib/fragments/config.dart b/lib/fragments/config.dart index 9ca6ae9..d7f0660 100644 --- a/lib/fragments/config.dart +++ b/lib/fragments/config.dart @@ -39,7 +39,7 @@ class _ConfigFragmentState extends State { } } - _buildAppSection() { + Widget _buildAppSection() { final items = [ if (Platform.isAndroid) Selector( @@ -150,7 +150,7 @@ class _ConfigFragmentState extends State { ); } - _buildGeneralSection() { + Widget _buildGeneralSection() { final items = [ Selector( selector: (_, clashConfig) => clashConfig.logLevel, @@ -335,14 +335,56 @@ class _ConfigFragmentState extends State { ); } + Widget _buildMoreSection() { + final items = [ + if (false) + Selector( + selector: (_, clashConfig) => clashConfig.tun.enable, + builder: (_, tunEnable, __) { + return ListItem.switchItem( + leading: const Icon( + Icons.important_devices_outlined + ), + title: Text(appLocalizations.tun), + subtitle: Text(appLocalizations.tunDesc), + delegate: SwitchDelegate( + value: tunEnable, + onChanged: (bool value) async { + final clashConfig = context.read(); + clashConfig.tun = Tun(enable: value); + globalState.appController.updateClashConfigDebounce(); + }, + ), + ); + }, + ), + ]; + if(items.isEmpty) return Container(); + return Section( + title: appLocalizations.general, + child: Column( + children: [ + for (final item in items) ...[ + item, + if (items.last != item) + const Divider( + height: 0, + ) + ] + ], + ), + ); + } + @override Widget build(BuildContext context) { List items = [ _buildAppSection(), _buildGeneralSection(), + _buildMoreSection(), ]; return ListView.builder( - padding: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.only(bottom: 32), itemBuilder: (_, index) { return Container( alignment: Alignment.center, diff --git a/lib/main.dart b/lib/main.dart index a7fe8d8..5b95f9f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -54,21 +54,18 @@ Future vpnService() async { int.parse(fd), ); })); + await globalState.init( appState: appState, config: config, clashConfig: clashConfig, ); - if (appState.isInit) { - globalState.applyProfile( - appState: appState, - config: config, - clashConfig: clashConfig, - ); - } else { - exit(0); - } + await globalState.applyProfile( + appState: appState, + config: config, + clashConfig: clashConfig, + ); final appLocalizations = await AppLocalizations.load( other.getLocaleForString(config.locale) ?? @@ -89,19 +86,18 @@ Future vpnService() async { ]; } - if (appState.isInit) { - handleStart(); - tile?.addListener( - TileListenerWithVpn( - onStop: () async { - await app?.tip(appLocalizations.stopVpn); - await globalState.stopSystemProxy(); - clashCore.shutdown(); - exit(0); - }, - ), - ); - } + handleStart(); + + tile?.addListener( + TileListenerWithVpn( + onStop: () async { + await app?.tip(appLocalizations.stopVpn); + await globalState.stopSystemProxy(); + clashCore.shutdown(); + exit(0); + }, + ), + ); } class ClashMessageListenerWithVpn with ClashMessageListener { diff --git a/lib/models/ffi.dart b/lib/models/ffi.dart index 25829ef..7d19f5d 100644 --- a/lib/models/ffi.dart +++ b/lib/models/ffi.dart @@ -79,7 +79,7 @@ class Process with _$Process { class ProcessMapItem with _$ProcessMapItem { const factory ProcessMapItem({ required int id, - String? value, + required String value, }) = _ProcessMapItem; factory ProcessMapItem.fromJson(Map json) => diff --git a/lib/models/generated/ffi.freezed.dart b/lib/models/generated/ffi.freezed.dart index 2c7a745..bd21ab2 100644 --- a/lib/models/generated/ffi.freezed.dart +++ b/lib/models/generated/ffi.freezed.dart @@ -1013,7 +1013,7 @@ ProcessMapItem _$ProcessMapItemFromJson(Map json) { /// @nodoc mixin _$ProcessMapItem { int get id => throw _privateConstructorUsedError; - String? get value => throw _privateConstructorUsedError; + String get value => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -1027,7 +1027,7 @@ abstract class $ProcessMapItemCopyWith<$Res> { ProcessMapItem value, $Res Function(ProcessMapItem) then) = _$ProcessMapItemCopyWithImpl<$Res, ProcessMapItem>; @useResult - $Res call({int id, String? value}); + $Res call({int id, String value}); } /// @nodoc @@ -1044,17 +1044,17 @@ class _$ProcessMapItemCopyWithImpl<$Res, $Val extends ProcessMapItem> @override $Res call({ Object? id = null, - Object? value = freezed, + Object? value = null, }) { return _then(_value.copyWith( id: null == id ? _value.id : id // ignore: cast_nullable_to_non_nullable as int, - value: freezed == value + value: null == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String?, + as String, ) as $Val); } } @@ -1067,7 +1067,7 @@ abstract class _$$ProcessMapItemImplCopyWith<$Res> __$$ProcessMapItemImplCopyWithImpl<$Res>; @override @useResult - $Res call({int id, String? value}); + $Res call({int id, String value}); } /// @nodoc @@ -1082,17 +1082,17 @@ class __$$ProcessMapItemImplCopyWithImpl<$Res> @override $Res call({ Object? id = null, - Object? value = freezed, + Object? value = null, }) { return _then(_$ProcessMapItemImpl( id: null == id ? _value.id : id // ignore: cast_nullable_to_non_nullable as int, - value: freezed == value + value: null == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String?, + as String, )); } } @@ -1100,7 +1100,7 @@ class __$$ProcessMapItemImplCopyWithImpl<$Res> /// @nodoc @JsonSerializable() class _$ProcessMapItemImpl implements _ProcessMapItem { - const _$ProcessMapItemImpl({required this.id, this.value}); + const _$ProcessMapItemImpl({required this.id, required this.value}); factory _$ProcessMapItemImpl.fromJson(Map json) => _$$ProcessMapItemImplFromJson(json); @@ -1108,7 +1108,7 @@ class _$ProcessMapItemImpl implements _ProcessMapItem { @override final int id; @override - final String? value; + final String value; @override String toString() { @@ -1144,8 +1144,9 @@ class _$ProcessMapItemImpl implements _ProcessMapItem { } abstract class _ProcessMapItem implements ProcessMapItem { - const factory _ProcessMapItem({required final int id, final String? value}) = - _$ProcessMapItemImpl; + const factory _ProcessMapItem( + {required final int id, + required final String value}) = _$ProcessMapItemImpl; factory _ProcessMapItem.fromJson(Map json) = _$ProcessMapItemImpl.fromJson; @@ -1153,7 +1154,7 @@ abstract class _ProcessMapItem implements ProcessMapItem { @override int get id; @override - String? get value; + String get value; @override @JsonKey(ignore: true) _$$ProcessMapItemImplCopyWith<_$ProcessMapItemImpl> get copyWith => diff --git a/lib/models/generated/ffi.g.dart b/lib/models/generated/ffi.g.dart index 1294057..d05fcf2 100644 --- a/lib/models/generated/ffi.g.dart +++ b/lib/models/generated/ffi.g.dart @@ -57,6 +57,7 @@ const _$MessageTypeEnumMap = { MessageType.process: 'process', MessageType.now: 'now', MessageType.request: 'request', + MessageType.run: 'run', }; _$DelayImpl _$$DelayImplFromJson(Map json) => _$DelayImpl( @@ -95,7 +96,7 @@ Map _$$ProcessImplToJson(_$ProcessImpl instance) => _$ProcessMapItemImpl _$$ProcessMapItemImplFromJson(Map json) => _$ProcessMapItemImpl( id: (json['id'] as num).toInt(), - value: json['value'] as String?, + value: json['value'] as String, ); Map _$$ProcessMapItemImplToJson( diff --git a/lib/plugins/proxy.dart b/lib/plugins/proxy.dart index d6308b8..deb9728 100644 --- a/lib/plugins/proxy.dart +++ b/lib/plugins/proxy.dart @@ -56,6 +56,10 @@ class Proxy extends ProxyPlatform { return await methodChannel.invokeMethod("SetProtect", {'fd': fd}); } + Future getRunTimeStamp() async { + return await methodChannel.invokeMethod("GetRunTimeStamp"); + } + Future startForeground({ required String title, required String content, @@ -75,8 +79,19 @@ class Proxy extends ProxyPlatform { } } + // updateStartTime() async { + // startTime = clashCore.getRunTime(); + // } + updateStartTime() async { - startTime = clashCore.getRunTime(); + startTime = await getRunTime(); + } + + Future getRunTime() async { + final runTimeStamp = await getRunTimeStamp(); + return runTimeStamp != null + ? DateTime.fromMillisecondsSinceEpoch(runTimeStamp) + : null; } } diff --git a/lib/widgets/clash_message_container.dart b/lib/widgets/clash_message_container.dart index 7d95759..7c955ef 100644 --- a/lib/widgets/clash_message_container.dart +++ b/lib/widgets/clash_message_container.dart @@ -1,6 +1,7 @@ import 'package:fl_clash/clash/clash.dart'; import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/models/models.dart'; +import 'package:fl_clash/plugins/proxy.dart'; import 'package:fl_clash/state.dart'; import 'package:flutter/material.dart'; import 'package:fl_clash/plugins/app.dart'; @@ -61,7 +62,7 @@ class _ClashMessageContainerState extends State clashCore.setProcessMap( ProcessMapItem( id: process.id, - value: packageName, + value: packageName ?? "", ), ); super.onProcess(process); @@ -72,4 +73,10 @@ class _ClashMessageContainerState extends State globalState.appController.appState.addRequest(connection); super.onRequest(connection); } + + @override + void onRun(String runTime) async { + // proxy?.updateStartTime(); + super.onRun(runTime); + } } diff --git a/pubspec.lock b/pubspec.lock index 9f488a9..136b3c4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "67.0.0" analyzer: @@ -14,7 +14,7 @@ packages: description: name: analyzer sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.4.1" animations: @@ -22,7 +22,7 @@ packages: description: name: animations sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.11" app_links: @@ -30,7 +30,7 @@ packages: description: name: app_links sha256: "3ced568a5d9e309e99af71285666f1f3117bddd0bd5b3317979dccc1a40cada4" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.5.1" archive: @@ -38,7 +38,7 @@ packages: description: name: archive sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.6.1" args: @@ -46,7 +46,7 @@ packages: description: name: args sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.0" async: @@ -54,7 +54,7 @@ packages: description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.11.0" boolean_selector: @@ -62,7 +62,7 @@ packages: description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" build: @@ -70,7 +70,7 @@ packages: description: name: build sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" build_config: @@ -78,7 +78,7 @@ packages: description: name: build_config sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" build_daemon: @@ -86,7 +86,7 @@ packages: description: name: build_daemon sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" build_resolvers: @@ -94,7 +94,7 @@ packages: description: name: build_resolvers sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" build_runner: @@ -102,7 +102,7 @@ packages: description: name: build_runner sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.11" build_runner_core: @@ -110,7 +110,7 @@ packages: description: name: build_runner_core sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.3.1" built_collection: @@ -118,7 +118,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: @@ -126,7 +126,7 @@ packages: description: name: built_value sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.9.2" characters: @@ -134,7 +134,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" charcode: @@ -142,7 +142,7 @@ packages: description: name: charcode sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" checked_yaml: @@ -150,7 +150,7 @@ packages: description: name: checked_yaml sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" cli_util: @@ -158,7 +158,7 @@ packages: description: name: cli_util sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.1" clock: @@ -166,7 +166,7 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" code_builder: @@ -174,7 +174,7 @@ packages: description: name: code_builder sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.10.0" collection: @@ -182,7 +182,7 @@ packages: description: name: collection sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.18.0" convert: @@ -190,7 +190,7 @@ packages: description: name: convert sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" country_flags: @@ -198,7 +198,7 @@ packages: description: name: country_flags sha256: dbc4f76e7c801619b2d841023e0327191ba00663f1f1b4770394e9bc6632c444 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" cross_file: @@ -206,7 +206,7 @@ packages: description: name: cross_file sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.3.4+1" crypto: @@ -214,7 +214,7 @@ packages: description: name: crypto sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.3" dart_style: @@ -222,7 +222,7 @@ packages: description: name: dart_style sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.6" dio: @@ -230,7 +230,7 @@ packages: description: name: dio sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.4.3+1" dynamic_color: @@ -238,7 +238,7 @@ packages: description: name: dynamic_color sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.7.0" fake_async: @@ -246,7 +246,7 @@ packages: description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" ffi: @@ -254,7 +254,7 @@ packages: description: name: ffi sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" ffigen: @@ -262,7 +262,7 @@ packages: description: name: ffigen sha256: dead012f29db2be71ea152458f5eab600de98fbc244e01088ae6bf2616bceca7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "11.0.0" file: @@ -270,7 +270,7 @@ packages: description: name: file sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.0" file_picker: @@ -278,7 +278,7 @@ packages: description: name: file_picker sha256: "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.0.5" file_selector_linux: @@ -286,7 +286,7 @@ packages: description: name: file_selector_linux sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.2+1" file_selector_macos: @@ -294,7 +294,7 @@ packages: description: name: file_selector_macos sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.4" file_selector_platform_interface: @@ -302,7 +302,7 @@ packages: description: name: file_selector_platform_interface sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.6.2" file_selector_windows: @@ -310,7 +310,7 @@ packages: description: name: file_selector_windows sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.3+1" fixnum: @@ -318,7 +318,7 @@ packages: description: name: fixnum sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" flutter: @@ -331,7 +331,7 @@ packages: description: name: flutter_lints sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" flutter_localizations: @@ -344,7 +344,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.20" flutter_test: @@ -362,7 +362,7 @@ packages: description: name: freezed sha256: a434911f643466d78462625df76fd9eb13e57348ff43fe1f77bbe909522c67a1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.2" freezed_annotation: @@ -370,7 +370,7 @@ packages: description: name: freezed_annotation sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" frontend_server_client: @@ -378,7 +378,7 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" glob: @@ -386,7 +386,7 @@ packages: description: name: glob sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" graphs: @@ -394,7 +394,7 @@ packages: description: name: graphs sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.1" gtk: @@ -402,7 +402,7 @@ packages: description: name: gtk sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" http: @@ -410,7 +410,7 @@ packages: description: name: http sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" http_multi_server: @@ -418,7 +418,7 @@ packages: description: name: http_multi_server sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" http_parser: @@ -426,7 +426,7 @@ packages: description: name: http_parser sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" image: @@ -434,7 +434,7 @@ packages: description: name: image sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.2.0" image_picker: @@ -442,7 +442,7 @@ packages: description: name: image_picker sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" image_picker_android: @@ -450,7 +450,7 @@ packages: description: name: image_picker_android sha256: "4161e1f843d8480d2e9025ee22411778c3c9eb7e40076dcf2da23d8242b7b51c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.8.12+3" image_picker_for_web: @@ -458,7 +458,7 @@ packages: description: name: image_picker_for_web sha256: "5d6eb13048cd47b60dbf1a5495424dea226c5faf3950e20bf8120a58efb5b5f3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.4" image_picker_ios: @@ -466,7 +466,7 @@ packages: description: name: image_picker_ios sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.8.12" image_picker_linux: @@ -474,7 +474,7 @@ packages: description: name: image_picker_linux sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.1+1" image_picker_macos: @@ -482,7 +482,7 @@ packages: description: name: image_picker_macos sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.1+1" image_picker_platform_interface: @@ -490,7 +490,7 @@ packages: description: name: image_picker_platform_interface sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.10.0" image_picker_windows: @@ -498,7 +498,7 @@ packages: description: name: image_picker_windows sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.1+1" intl: @@ -506,7 +506,7 @@ packages: description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.19.0" io: @@ -514,7 +514,7 @@ packages: description: name: io sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.4" jovial_misc: @@ -522,7 +522,7 @@ packages: description: name: jovial_misc sha256: f6e64f789ee311025bb367be9c9afe9759f76dd8209070b7f38e735b5f529eb1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.8.5" jovial_svg: @@ -530,7 +530,7 @@ packages: description: name: jovial_svg sha256: "000cafe183bdeba28f76d65bf93fc9b636d6f7eaa7e2a33e80c4345a28866ea8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.21" js: @@ -538,7 +538,7 @@ packages: description: name: js sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.1" json_annotation: @@ -546,7 +546,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.0" json_serializable: @@ -554,7 +554,7 @@ packages: description: name: json_serializable sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.8.0" launch_at_startup: @@ -562,7 +562,7 @@ packages: description: name: launch_at_startup sha256: "93fc5638e088290004fae358bae691486673d469957d461d9dae5b12248593eb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" leak_tracker: @@ -570,7 +570,7 @@ packages: description: name: leak_tracker sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "10.0.4" leak_tracker_flutter_testing: @@ -578,7 +578,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.3" leak_tracker_testing: @@ -586,7 +586,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" lints: @@ -594,7 +594,7 @@ packages: description: name: lints sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" logging: @@ -602,7 +602,7 @@ packages: description: name: logging sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.0" matcher: @@ -610,7 +610,7 @@ packages: description: name: matcher sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.16+1" material_color_utilities: @@ -618,7 +618,7 @@ packages: description: name: material_color_utilities sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.8.0" menu_base: @@ -626,7 +626,7 @@ packages: description: name: menu_base sha256: "820368014a171bd1241030278e6c2617354f492f5c703d7b7d4570a6b8b84405" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.1" meta: @@ -634,7 +634,7 @@ packages: description: name: meta sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.0" mime: @@ -642,7 +642,7 @@ packages: description: name: mime sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.5" mobile_scanner: @@ -650,7 +650,7 @@ packages: description: name: mobile_scanner sha256: b8c0e9afcfd52534f85ec666f3d52156f560b5e6c25b1e3d4fe2087763607926 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" nested: @@ -658,7 +658,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" package_config: @@ -666,7 +666,7 @@ packages: description: name: package_config sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" package_info_plus: @@ -674,7 +674,7 @@ packages: description: name: package_info_plus sha256: "2c582551839386fa7ddbc7770658be7c0f87f388a4bff72066478f597c34d17f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.0" package_info_plus_platform_interface: @@ -682,7 +682,7 @@ packages: description: name: package_info_plus_platform_interface sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" path: @@ -690,7 +690,7 @@ packages: description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.0" path_provider: @@ -698,7 +698,7 @@ packages: description: name: path_provider sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" path_provider_android: @@ -706,7 +706,7 @@ packages: description: name: path_provider_android sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.5" path_provider_foundation: @@ -714,7 +714,7 @@ packages: description: name: path_provider_foundation sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" path_provider_linux: @@ -722,7 +722,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -730,7 +730,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" path_provider_windows: @@ -738,7 +738,7 @@ packages: description: name: path_provider_windows sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" petitparser: @@ -746,7 +746,7 @@ packages: description: name: petitparser sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.2" platform: @@ -754,7 +754,7 @@ packages: description: name: platform sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.5" plugin_platform_interface: @@ -762,7 +762,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" pointycastle: @@ -770,7 +770,7 @@ packages: description: name: pointycastle sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.9.1" pool: @@ -778,7 +778,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.1" provider: @@ -786,7 +786,7 @@ packages: description: name: provider sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.2" proxy: @@ -801,7 +801,7 @@ packages: description: name: pub_semver sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" pubspec_parse: @@ -809,7 +809,7 @@ packages: description: name: pubspec_parse sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" quiver: @@ -817,7 +817,7 @@ packages: description: name: quiver sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" screen_retriever: @@ -825,7 +825,7 @@ packages: description: name: screen_retriever sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.9" shared_preferences: @@ -833,7 +833,7 @@ packages: description: name: shared_preferences sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.3" shared_preferences_android: @@ -841,7 +841,7 @@ packages: description: name: shared_preferences_android sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.3" shared_preferences_foundation: @@ -849,7 +849,7 @@ packages: description: name: shared_preferences_foundation sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" shared_preferences_linux: @@ -857,7 +857,7 @@ packages: description: name: shared_preferences_linux sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" shared_preferences_platform_interface: @@ -865,7 +865,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" shared_preferences_web: @@ -873,7 +873,7 @@ packages: description: name: shared_preferences_web sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" shared_preferences_windows: @@ -881,7 +881,7 @@ packages: description: name: shared_preferences_windows sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" shelf: @@ -889,7 +889,7 @@ packages: description: name: shelf sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" shelf_web_socket: @@ -897,7 +897,7 @@ packages: description: name: shelf_web_socket sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.0" shortid: @@ -905,7 +905,7 @@ packages: description: name: shortid sha256: d0b40e3dbb50497dad107e19c54ca7de0d1a274eb9b4404991e443dadb9ebedb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.2" sky_engine: @@ -918,7 +918,7 @@ packages: description: name: source_gen sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" source_helper: @@ -926,7 +926,7 @@ packages: description: name: source_helper sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.4" source_span: @@ -934,7 +934,7 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.0" stack_trace: @@ -942,7 +942,7 @@ packages: description: name: stack_trace sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.11.1" stream_channel: @@ -950,7 +950,7 @@ packages: description: name: stream_channel sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" stream_transform: @@ -958,7 +958,7 @@ packages: description: name: stream_transform sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" string_scanner: @@ -966,7 +966,7 @@ packages: description: name: string_scanner sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.0" term_glyph: @@ -974,7 +974,7 @@ packages: description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" test_api: @@ -982,7 +982,7 @@ packages: description: name: test_api sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.0" timing: @@ -990,7 +990,7 @@ packages: description: name: timing sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" tray_manager: @@ -998,7 +998,7 @@ packages: description: name: tray_manager sha256: c9a63fd88bd3546287a7eb8ccc978d707eef82c775397af17dda3a4f4c039e64 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.3" typed_data: @@ -1006,7 +1006,7 @@ packages: description: name: typed_data sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.2" url_launcher: @@ -1014,7 +1014,7 @@ packages: description: name: url_launcher sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.0" url_launcher_android: @@ -1022,7 +1022,7 @@ packages: description: name: url_launcher_android sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.3" url_launcher_ios: @@ -1030,7 +1030,7 @@ packages: description: name: url_launcher_ios sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.0" url_launcher_linux: @@ -1038,7 +1038,7 @@ packages: description: name: url_launcher_linux sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" url_launcher_macos: @@ -1046,7 +1046,7 @@ packages: description: name: url_launcher_macos sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.0" url_launcher_platform_interface: @@ -1054,7 +1054,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" url_launcher_web: @@ -1062,7 +1062,7 @@ packages: description: name: url_launcher_web sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.1" url_launcher_windows: @@ -1070,7 +1070,7 @@ packages: description: name: url_launcher_windows sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" vector_math: @@ -1078,7 +1078,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" vm_service: @@ -1086,7 +1086,7 @@ packages: description: name: vm_service sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "14.2.1" watcher: @@ -1094,7 +1094,7 @@ packages: description: name: watcher sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" web: @@ -1102,7 +1102,7 @@ packages: description: name: web sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.5.1" web_socket: @@ -1110,7 +1110,7 @@ packages: description: name: web_socket sha256: "24301d8c293ce6fe327ffe6f59d8fd8834735f0ec36e4fd383ec7ff8a64aa078" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.5" web_socket_channel: @@ -1118,7 +1118,7 @@ packages: description: name: web_socket_channel sha256: a2d56211ee4d35d9b344d9d4ce60f362e4f5d1aafb988302906bd732bc731276 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" webdav_client: @@ -1126,7 +1126,7 @@ packages: description: name: webdav_client sha256: "682fffc50b61dc0e8f46717171db03bf9caaa17347be41c0c91e297553bf86b2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" win32: @@ -1134,7 +1134,7 @@ packages: description: name: win32 sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.5.1" win32_registry: @@ -1142,7 +1142,7 @@ packages: description: name: win32_registry sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.3" window_manager: @@ -1150,7 +1150,7 @@ packages: description: name: window_manager sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.3.9" windows_single_instance: @@ -1158,7 +1158,7 @@ packages: description: name: windows_single_instance sha256: "50d5dcd6bec90b4a5ed588b1822b1aad21b39fc96da843e61c734b3caccfd2fc" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" xdg_directories: @@ -1166,7 +1166,7 @@ packages: description: name: xdg_directories sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.4" xml: @@ -1174,7 +1174,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.0" yaml: @@ -1182,7 +1182,7 @@ packages: description: name: yaml sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" yaml_edit: @@ -1190,7 +1190,7 @@ packages: description: name: yaml_edit sha256: e9c1a3543d2da0db3e90270dbb1e4eebc985ee5e3ffe468d83224472b2194a5f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" zxing2: @@ -1198,7 +1198,7 @@ packages: description: name: zxing2 sha256: "6cf995abd3c86f01ba882968dedffa7bc130185e382f2300239d2e857fc7912c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.3" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index de52a89..a2255e3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: fl_clash description: A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free. publish_to: 'none' -version: 0.8.23 +version: 0.8.24 environment: sdk: '>=3.1.0 <4.0.0'