如何在 android:updatePeriodMillis="0" 时从 Flutter 更新 Android 小部件?
How can I update an Android widget from Flutter while android:updatePeriodMillis="0"?
我是新来的。我正在慢慢掌握 Flutter 的窍门,但在 Kotlin/Java 集成方面完全是个新手。我正在尝试制作一个 Flutter 应用程序,其中一些数据在 Flutter istelf 中不定期更新,然后显示在主屏幕小部件上。
我不想定期更新 Android 小部件,因为可能每天都没有什么要更改的,只是偶尔更新。在寻找实际制作小部件的方法时,我发现了这个 really helpful answer from bnxm and a good implementation on Github from timobaehr。
以此为例,如果我想在按下应用程序中的按钮(或后台服务 运行)时更新主屏幕小部件上显示的“结果”怎么办? ,而不是在设定的时间间隔内? Timobaehr 在他的演示中使用了默认的 Flutter 计数应用程序,那么当按下按钮时,我可以用这段 运行 的代码做什么?
这里是main.dart中的更新函数:
void onWidgetUpdate() {
WidgetsFlutterBinding.ensureInitialized();
const MethodChannel channel = MethodChannel('com.example.app/widget');
channel.setMethodCallHandler(
(call) async {
final id = call.arguments;
print('on Dart ${call.method}!');
return {
'id': id,
// Some data of type int - this is what I want to update
'value': counter,
};
},
);
}
下面是代码中根据默认的 Flutter 启动应用程序更新值的地方。我还把 int counter = 0;
移到了 dart 文件的顶部,这样它就可以随处使用。
void _incrementCounter() {
setState(() {
counter++;
});
// How can I update the home screen widget from here?
// For example, send the new value of 'counter' to 'value' in the update function
// so that the new value is displayed on the home screen widget
}
它是像在这里添加一些东西一样简单,还是需要在其他地方更改 Kotlin 代码?感谢您的帮助。
编辑:我应该说,从增量函数调用 onWidgetUpdate() 根本不会改变小部件,所以我假设必须有其他事情需要发生,可能在后台 Kotlin 代码中或与MethodChannels,我不熟悉
如果你想 运行 自己测试,我从 timobaehr's Github project 克隆并只是将 'value' 更改为来自 'counter' 并且是一个 int 而不是双.
好的,我想我明白了。将它张贴在这里以防它对其他人有帮助。
正如我所怀疑的那样,这是必须在 Kotlin 中进行更改的内容。所以对我来说有一点额外的学习!如果您正在关注 timobaehr's project on Github,您可以尝试进行如下更改:
我写了一个名为“updateFromFlutter”的新方法并将其添加到 MainActivity.kt:
when (call.method) {
"initialize" -> {
if (call.arguments == null) return
WidgetHelper.setHandle(this, call.arguments as Long)
}
"updateFromFlutter" -> {
val views = RemoteViews(context.packageName, R.layout.widget_layout).apply {
setTextViewText(R.id.text, call.argument("text"))
}
val id: Int = call.argument("id")!!
val manager = AppWidgetManager.getInstance(this)
manager.updateAppWidget(id, views)
}
}
记得在 MainActivity.kt 的顶部导入这些:
import android.widget.RemoteViews
import com.example.flutter_app_android_widget.R
import android.appwidget.AppWidgetManager
并在更新计数器值后从 main.dart 调用它:
const MethodChannel platform = MethodChannel('com.example.flutter_app_android_widget/widget');
platform.invokeMethod("updateFromFlutter", {
"text": counter.toString(),
"id": //get the integer from Shared Preferences - up to you how you do this
//or feel free to suggest a better way of keeping track of the widget id
});
然后您应该能够通过按 Flutter 应用中的按钮按需更新主屏幕小部件。
我是新来的。我正在慢慢掌握 Flutter 的窍门,但在 Kotlin/Java 集成方面完全是个新手。我正在尝试制作一个 Flutter 应用程序,其中一些数据在 Flutter istelf 中不定期更新,然后显示在主屏幕小部件上。
我不想定期更新 Android 小部件,因为可能每天都没有什么要更改的,只是偶尔更新。在寻找实际制作小部件的方法时,我发现了这个 really helpful answer from bnxm and a good implementation on Github from timobaehr。
以此为例,如果我想在按下应用程序中的按钮(或后台服务 运行)时更新主屏幕小部件上显示的“结果”怎么办? ,而不是在设定的时间间隔内? Timobaehr 在他的演示中使用了默认的 Flutter 计数应用程序,那么当按下按钮时,我可以用这段 运行 的代码做什么?
这里是main.dart中的更新函数:
void onWidgetUpdate() {
WidgetsFlutterBinding.ensureInitialized();
const MethodChannel channel = MethodChannel('com.example.app/widget');
channel.setMethodCallHandler(
(call) async {
final id = call.arguments;
print('on Dart ${call.method}!');
return {
'id': id,
// Some data of type int - this is what I want to update
'value': counter,
};
},
);
}
下面是代码中根据默认的 Flutter 启动应用程序更新值的地方。我还把 int counter = 0;
移到了 dart 文件的顶部,这样它就可以随处使用。
void _incrementCounter() {
setState(() {
counter++;
});
// How can I update the home screen widget from here?
// For example, send the new value of 'counter' to 'value' in the update function
// so that the new value is displayed on the home screen widget
}
它是像在这里添加一些东西一样简单,还是需要在其他地方更改 Kotlin 代码?感谢您的帮助。
编辑:我应该说,从增量函数调用 onWidgetUpdate() 根本不会改变小部件,所以我假设必须有其他事情需要发生,可能在后台 Kotlin 代码中或与MethodChannels,我不熟悉
如果你想 运行 自己测试,我从 timobaehr's Github project 克隆并只是将 'value' 更改为来自 'counter' 并且是一个 int 而不是双.
好的,我想我明白了。将它张贴在这里以防它对其他人有帮助。
正如我所怀疑的那样,这是必须在 Kotlin 中进行更改的内容。所以对我来说有一点额外的学习!如果您正在关注 timobaehr's project on Github,您可以尝试进行如下更改:
我写了一个名为“updateFromFlutter”的新方法并将其添加到 MainActivity.kt:
when (call.method) {
"initialize" -> {
if (call.arguments == null) return
WidgetHelper.setHandle(this, call.arguments as Long)
}
"updateFromFlutter" -> {
val views = RemoteViews(context.packageName, R.layout.widget_layout).apply {
setTextViewText(R.id.text, call.argument("text"))
}
val id: Int = call.argument("id")!!
val manager = AppWidgetManager.getInstance(this)
manager.updateAppWidget(id, views)
}
}
记得在 MainActivity.kt 的顶部导入这些:
import android.widget.RemoteViews
import com.example.flutter_app_android_widget.R
import android.appwidget.AppWidgetManager
并在更新计数器值后从 main.dart 调用它:
const MethodChannel platform = MethodChannel('com.example.flutter_app_android_widget/widget');
platform.invokeMethod("updateFromFlutter", {
"text": counter.toString(),
"id": //get the integer from Shared Preferences - up to you how you do this
//or feel free to suggest a better way of keeping track of the widget id
});
然后您应该能够通过按 Flutter 应用中的按钮按需更新主屏幕小部件。