ALDIĞIM HATA KODU;
I/flutter (27525): view model notifyListeners E/flutter (27525): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: MissingPluginException(No implementation found for method getConnectedDate on channel com.sail_tunnel.sail/vpn_manager) E/flutter (27525): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:313:7) E/flutter (27525): <asynchronous suspension> E/flutter (27525): #1 VpnManager.getConnectedDate (package:sail/channels/vpn_manager.dart:44:16) E/flutter (27525): <asynchronous suspension> E/flutter (27525): #2 AppModel.getConnectedDate (package:sail/models/app_model.dart:70:16) E/flutter (27525): <asynchronous suspension> E/flutter (27525): ======== Exception caught by widgets library ======================================================= The following _CastError was thrown building ConnectionStats(dirty, dependencies: [_InheritedProviderScope<AppModel?>, _InheritedProviderScope<UserModel?>], state: ConnectionStatsState#6a56a): Null check operator used on a null value The relevant error-causing widget was: ConnectionStats ConnectionStats:file:///C:/uygualamalar/sail23042023/lib/widgets/home_widget.dart:106:36 When the exception was thrown, this was the stack: #0 ConnectionStatsState.build (package:sail/widgets/connection_stats.dart:58:50) #1 StatefulElement.build (package:flutter/src/widgets/framework.dart:5080:27) #2 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4968:15) #3 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5133:11) #4 Element.rebuild (package:flutter/src/widgets/framework.dart:4690:5) #5 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2743:19) #6 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:863:21) #7 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:381:5) #8 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1289:15) #9 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1218:9) #10 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1076:5) #11 _invoke (dart:ui/hooks.dart:145:13) #12 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:338:5) #13 _drawFrame (dart:ui/hooks.dart:112:31)
KOD
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:sail/adapters/leaf_ffi/config.dart';
import 'package:sail/channels/vpn_manager.dart';
import 'package:sail/constant/app_colors.dart';
import 'package:sail/constant/app_strings.dart';
import 'package:sail/models/base_model.dart';
import 'package:sail/models/server_model.dart';
import 'package:sail/models/user_model.dart';
import 'package:sail/utils/common_util.dart';
class AppModel extends BaseModel {
VpnManager vpnManager = VpnManager();
VpnStatus vpnStatus = VpnStatus.disconnected;
bool isOn = false;
DateTime? connectedDate;
PageController pageController = PageController(initialPage: 0);
String appTitle = AppStrings.appName;
Config config = Config();
ThemeData themeData = ThemeData(
primarySwatch: AppColors.themeColor,
visualDensity: VisualDensity.adaptivePlatformDensity,
);
AppModel() {
General general = General(
loglevel: 'info',
logoutput: '{{leafLogFile}}',
dnsServer: ['223.5.5.5', '114.114.114.114'],
tunFd: '{{tunFd}}',
routingDomainResolve: true);
List<Rule> rules = [];
// rules.add(Rule(typeField: 'EXTERNAL', target: 'Direct', filter: 'site:cn'));
rules.add(Rule(typeField: 'FINAL', target: 'Direct'));
config.general = general;
config.rules = rules;
}
final Map _tabMap = {
0: AppStrings.appName,
1: '套餐',
2: '节点',
3: '我的',
};
void jumpToPage(int page) {
pageController.jumpToPage(page);
appTitle = _tabMap[page];
notifyListeners();
}
void getStatus() async {
vpnStatus = await vpnManager.getStatus();
if (vpnStatus == VpnStatus.connected) {
isOn = true;
getConnectedDate();
notifyListeners();
} else if (vpnStatus == VpnStatus.disconnected) {
isOn = false;
notifyListeners();
}
}
void getConnectedDate() async {
var date = await vpnManager.getConnectedDate();
print("date: $date");
connectedDate = date;
}
void togglePowerButton() async {
if (vpnStatus == VpnStatus.connecting) {
Fluttertoast.showToast(
msg: "Bağlanıyor, lütfen bekleyin...",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 2,
textColor: Colors.white,
fontSize: 14.0);
return;
}
if (vpnStatus == VpnStatus.disconnecting) {
Fluttertoast.showToast(
msg: "Bağlantı kesiliyor, lütfen bekleyin...",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 2,
textColor: Colors.white,
fontSize: 14.0);
return;
}
if (vpnStatus == VpnStatus.connected) {
vpnStatus = VpnStatus.disconnecting;
}
if (vpnStatus == VpnStatus.disconnected) {
vpnStatus = VpnStatus.connecting;
}
await vpnManager.toggle();
notifyListeners();
}
void getTunnelLog() async {
var log = await vpnManager.getTunnelLog();
print("log: $log");
}
void getTunnelConfiguration() async {
var conf = await vpnManager.getTunnelConfiguration();
print("config: $conf");
}
void setConfigProxies(UserModel userModel, ServerModel serverModel) async {
List<Proxy> proxies = [];
List<ProxyGroup> proxyGroups = [];
List<String> actors = [];
for (var server in serverModel.serverEntityList) {
Proxy proxy = Proxy(
tag: server.name,
protocol: server.type,
address: server.host,
port: server.port,
encryptMethod: server.cipher,
password: userModel.userEntity!.uuid);
proxies.add(proxy);
actors.add(server.name);
}
if (actors.isNotEmpty) {
proxyGroups.add(ProxyGroup(
tag: "UrlTest",
protocol: 'url-test',
actors: actors,
checkInterval: 600));
config.rules?.last.target = "UrlTest";
}
config.proxies = proxies;
config.proxyGroups = proxyGroups;
print("-----------------config-----------------");
print(config);
print("-----------------config-----------------");
vpnManager.setTunnelConfiguration(config.toString());
}
void setConfigRule(String tag) async {
// var proxy = config.proxies?.where((proxies) => proxies.tag == tag);
//
// if (proxy == null || proxy.isEmpty) {
// return;
// }
//
// config.rules?.last.target = tag;
//
// print("-----------------config-----------------");
// print(config);
// print("-----------------config-----------------");
//
// vpnManager.setTunnelConfiguration(config.toString());
}
}