Hola, Amigos! На связи Вова Зевеке, Flutter dev Amiga. Сегодня расскажем, как сделать виджет HomeScreen с помощью пакета home_widget.
Для приложения на Android создадим макет виджета внутри android/app/src/main/res/layout. Нажимаем правой кнопкой мыши на папку android, выбираем Flutter/Open Android module in Android Studio. В новом окне нажимаем правой кнопкой мыши на app, выбираем New/Widget.
Сгенерируется несколько файлов для редактирования. Один из них — файл конфигурации виджета (расположен в android/app/src/main/res/xml). Ещё один файл – сам макет виджета (расположен в android/app/src/main/res/layout).
Обратите особое внимание в коде ниже на строчку
android:id="@+id/firstString". Тут мы выдали тексту id-шник, который нам понадобится позже.</RelativeLayout
<TextView
android:id="@+id/firstString"
… />
</RelativeLayout>
Также в AndroidManifest.xml у нас появился ресивер.
<receiver
android:name=".HomeWidgetTextTable"…
</receiver>
Нам осталось настроить передачу данных между нашим Flutter-приложением и HomeWidget. Для этого в файле android\app\src\main\java\com\example\sandbox\HomeWidgetTextTable.kt импортируем плагин и пишем код обновления HomeWidget.
class HomeWidgetTextTable : AppWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
}
}
internal fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int
) {
val widgetData = HomeWidgetPlugin.getData(context)
val firstString = widgetData.getString("firstString", null)
val views = RemoteViews(context.packageName, R.layout.home_widget_text_table)
views.setTextViewText(R.id.firstString, firstString)
appWidgetManager.updateAppWidget(appWidgetId, views)
}Теперь создаем TextField и набираем текст, отображаемый в HomeWidget.
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
HomeWidget.initiallyLaunchedFromHomeWidget().then((value) async {
updateUI();
});
});
super.initState();
}
void updateUI() {
var text = controller.text;
HomeWidget.saveWidgetData<String>('firstString', text);
HomeWidget.updateWidget(
//name: 'TextTable',
androidName: 'HomeWidgetTextTable',
iOSName: 'HomeWidgetTextTable',
);
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
controller: controller,
style: const TextStyle(
color: Colors.white,
),
onChanged: (value) {
updateUI();
},
),
const SizedBox(height: 16),
],
);
}
}
Как мы видим, созданный нами метод updateUI отвечает за передачу новых данных HomeWidget.
Ставьте реакцию, если было полезно!