我已经使用Connectivity 的自述文件设置了一项基本检查来检查互联网连接。
@override
void initState() {
super.initState();
subscription = Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) {
// Got a new connectivity status!
print("Check: $result");
});
}
@override
void dispose() {
print("Disposing Connection ...");
super.dispose();
subscription.cancel();
}
Run Code Online (Sandbox Code Playgroud)
我没有对代码本身进行任何重大更改。onConnectivityChanged()但是,当我检查日志时,每次连接发生变化时,应用程序似乎都会调用该函数两次。
这是日志:
Restarted application in 1,611ms.
I/flutter (17481): Check: ConnectivityResult.none
I/flutter (17481): Check: ConnectivityResult.mobile
I/flutter (17481): Check: ConnectivityResult.mobile
I/flutter (17481): Check: ConnectivityResult.none
I/flutter (17481): Check: ConnectivityResult.none
I/flutter (17481): Check: ConnectivityResult.wifi
I/flutter (17481): Check: ConnectivityResult.wifi
Run Code Online (Sandbox Code Playgroud)
第一个结果是ConnectivityResult.none并且只出现一次。因为应用程序仅在当前小部件加载时检查连接一次。然而,在第一个(正确的)结果之后,所有结果都会获得两次,即使它们应该只出现一次。
这导致我的应用程序出现一些复杂情况。每次看到连接更改时,我都会向用户显示一个对话框,其中包含以下选项:
您离线
您正在使用移动网络
但由于检查在连接更改时以某种方式运行两次,因此我看到了两个对话框。不仅如此,因为当我从上下文中弹出对话框时,应用程序会再次加载并检查initState()是否导致对话框再次显示。除非手机连接到 …
在我的 flutter 应用程序中,我使用此代码转到我的仪表板页面,但第一次没有这样做,我收到了debugLocked错误消息。
应用程序中的启动页面是一个路由器,它检查共享首选项“sessionid”,如果设置,则将用户直接带到仪表板,否则将他们带到登录。
如果没有下面的代码,我就可以很好地访问我的仪表板,Navigator.pushReplacement()但是随后,appBar 上出现了一个后退箭头。此后退按钮将应用程序带回路由器。
我搜索了有关如何从导航器中删除所有屏幕的答案,以下是我发现的内容。
Navigator.of(context).popUntil(ModalRoute.withName(Dashboard.id));
Run Code Online (Sandbox Code Playgroud)
使用上面的代码给了我debugLocked错误。有没有办法缓解这个问题?或者有没有其他有效的方法可以从上下文中删除屏幕?设置是否automaticallyImplyLeading有false帮助?因为只有在有人登录或注册后才会出现此错误。
我已经在 Dart 和 Kotlin 中建立了一个基本的方法通道
飞镖代码
Future<void> _updateProfile() async {
try {
var result = await platform.invokeMethod('updateProfile');
print(result);
} on PlatformException catch (e) {
print('Failed to get battery level: ${e.message}');
}
setState(() {
// print('Setting state');
});
}
Run Code Online (Sandbox Code Playgroud)
科特林代码
MethodChannel(flutterView, channel).setMethodCallHandler { call, result ->
if(call.method == "updateProfile"){
val actualResult = updateProfile()
if (actualResult.equals("Method channel Success")) {
result.success(actualResult)
} else {
result.error("UNAVAILABLE", "Result was not what I expected", null)
}
} else {
result.notImplemented()
}
}
Run Code Online (Sandbox Code Playgroud)
我想将 JSON/Map 数据传递给 Kotlin …
我正在查看秒表的文档,我确信他们没有方法以初始值启动秒表。
我正在开发一个需要测量经过时间的应用程序。因此,秒表成为这里显而易见的选择。但是,有一个用例,应用程序的用户在清除后台应用程序时可能会意外关闭应用程序。
由于现在在后台运行 headless dart 代码有点模糊,因此我认为最好跟踪时间和时间间隙(如果在意外关闭后恢复应用程序时有任何时间间隙)。像下面这样的单独的数据对象可以跟踪时间以及秒表是否正在运行......
class StopwatchTracker{
final stopwatch;
final lastUpdated;
final isRunning;
final systemTime;
StopwatchTracker({this.stopwatch, this.lastUpdated, this.isRunning, this.systemTime});
}
Run Code Online (Sandbox Code Playgroud)
lastUpdated有了这个,我就有了一个包含秒表时间数据的对象。将此与 进行比较systemTime,后者将是设备的当前系统时间。lastUpdated现在,我们可以看看时间和时间之间是否存在差距systemTime。如果存在间隙,秒表应按“间隙”单位“跳跃”到时间。
该StopwatchTracker对象只会在应用程序启动/恢复时初始化,每隔几秒,它就会更新时间lastUpdated。我认为逻辑是存在的,但是,正如我提到的,dart 中的 Stopwatch 类没有用起始值初始化它的方法。
我想知道是否可以扩展 Stopwatch 类来容纳一个方法来做到这一点。或者第二个选项是更新ellapsedMillis本身或添加到gap in mills然后ellapsedMillis在屏幕上显示结果。
很想听听你们的意见!
我正在尝试在 Kotlin 中创建一个扩展函数。我确实尝试了几个教程,但不太明白如何实现这个教程。
我正在尝试创建一个setWidth()这样的函数
//Find my_view in the fragment
val myView = v.findViewById<RelativeLayout>(R.id.my_view)
//Then use the extension function
myView.setNewWidth(500)
Run Code Online (Sandbox Code Playgroud)
这就是我定义扩展函数的方式
private fun View?.setNewWidth(i: Int) {
val layoutParams: ViewGroup.LayoutParams = View.layoutParams
layoutParams.width = i
View.layoutParams = layoutParams
}
Run Code Online (Sandbox Code Playgroud)
我不明白我需要在这里做什么。
我想将扩展函数称为myView.ExtensionFunction(),但我不知道该怎么做。教程内容不详。
extension-methods android android-view kotlin kotlin-extension
android ×4
dart ×4
flutter ×4
kotlin ×2
android-view ×1
connectivity ×1
navigation ×1
stopwatch ×1
timer ×1