SwiftUI——Widget extension(intent)默认代码注释讲解

这里事先说明一下,Intent是用户可以对小组件widget做一些调整。这里的调整在长按小组件时,点击出现的“编辑小组件”,然后进行的操作。
如下图:在这里插入图片描述

现在来看代码:

import WidgetKit
import SwiftUI
import Intents

//数据结构
struct SimpleEntry: TimelineEntry {
    let date: Date
//这里需要注意,ConfigurationIntent是预先设定好的,代码如下:
//    public class ConfigurationIntent: INIntent {
//
//    }
    let configuration: ConfigurationIntent
}

//Provider提供placeholder(占位符)、getSnapshot(快照)和getTimeline(时间线)
struct Provider: IntentTimelineProvider {
    //定义占位符—
    //参数前要加in,返回值为之前定义的SimpleEntry结构——这里的返回值就是SimpleEntry本身,意思就是不改变原视图
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date(), configuration: ConfigurationIntent())
    }

    //定义快照
    //@escaping表示逃逸闭包,就是在返回值之后执行的闭包。也就是在函数执行并且返回完返回值才执行的闭包。
    //这里的逃逸闭包是以结构体SimpleEntry为参数,返回值为空。
//     - Parameters:
//       - configuration: The intent containing user-customized values.
//       - context: An object describing the context to show the widget in.
//       - completion: The completion handler to call after you create the
//         snapshot entry.
//     - 参数:
//        - configuration: 包含用户定义值的意图。(这个参数需要预先定义,这里是在SimpleEntry结构体里)
//        - context: 一个描述什么会显示在widget上的对象
//        - completion: 一个完成代理(completion handler)在你创建snapshot(快照)后被调用。
    func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        //创建快照entry
        let entry = SimpleEntry(date: Date(), configuration: configuration)
        //定义完成代理调用快照entry
        completion(entry)
    }

    //定义时间线
    //这里的逃逸闭包是以结构体SimpleEntry为参数,返回值为空。
    func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        //定义一个数组entries,里面存着的就是时间线上不同时间生成的界面
        //格式是[],里面是结构体SimpleEntry的内容
        var entries: [SimpleEntry] = []

        //生成一个时间线,包含了五个entry,每个相隔一小时,从当前日期开始。
        //entry相当于一个视图的数据
        // Generate a timeline consisting of five entries an hour apart, starting from the current date.
        let currentDate = Date()
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .calendar, value: hourOffset, to: currentDate)!
            let entry = SimpleEntry(date: entryDate, configuration: configuration)
            //然后将生成的entry放入数组entries中,也就是放入时间线中
            entries.append(entry)
        }

        let timeline = Timeline(entries: entries, policy: .atEnd)
        //定义完成代理调用时间线timeline
        completion(timeline)
    }
}

//设计界面————就和一般的SwiftUI设计界面一样
struct WidgetViewEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        Text(entry.date, style: .time)
    }
}

//Widget(小组件)部分
//@main表示最先显示该界面
@main
struct WIdgetView: Widget {
    let kind: String = "1"

    var body: some WidgetConfiguration {
        IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
            //将设计好的WidgetViewEntryView
            WidgetViewEntryView(entry: entry)
        }
        //编辑小组件的时候显示的名称
        .configurationDisplayName("小组件名称")
        //编辑小组件的时候显示的描述
        .description("这是一段显示小组件描述的文本")
        //该小组件支持哪些尺寸
        .supportedFamilies([.systemSmall, .systemMedium])
    }
}

//预览
struct WidgetView_Previews: PreviewProvider {
    static var previews: some View {
        WidgetViewEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent()))
            .previewContext(WidgetPreviewContext(family: .systemSmall)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建 Android 应用程序中的 App Widget,需要以下步骤: 1. 创建 App Widget Provider 类 ```java public class MyWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // 更新 App Widget RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.tv_widget, "Hello World!"); appWidgetManager.updateAppWidget(appWidgetIds, views); } } ``` 2. 声明 App Widget Provider 在 AndroidManifest.xml 文件中声明 App Widget Provider,如下所示: ```xml <receiver android:name=".MyWidgetProvider" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/my_widget_info" /> </receiver> ``` 其中,MyWidgetProvider 是你的 App Widget Provider 类名,@string/app_name 是你应用的名称,@xml/my_widget_info 是你的 App Widget Provider 的相关信息,需要在 res/xml 目录下创建一个名为 my_widget_info.xml 的文件,并在该文件中指定你的 App Widget 的布局和其他属性。 3. 定义 App Widget 的布局 在 res/layout 目录下创建一个名为 widget_layout.xml 的文件,定义 App Widget 的布局,如下所示: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/widget_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"> <TextView android:id="@+id/tv_widget" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="#000000" /> </RelativeLayout> ``` 4. 更新 App Widget 在 onUpdate() 方法中,更新 App Widget 的 UI。可以使用 RemoteViews 对象更新 App Widget 的 UI,如下所示: ```java @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // 更新 App Widget RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.tv_widget, "Hello World!"); appWidgetManager.updateAppWidget(appWidgetIds, views); } ``` 5. 安装 App Widget 在应用的首次安装时,需要向用户请求授权,以便创建 App Widget。可以使用以下代码向用户请求授权: ```java // 请求授权 Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, new ComponentName(context, MyWidgetProvider.class)); int REQUEST_PICK_APPWIDGET = 1; ((Activity) context).startActivityForResult(intent, REQUEST_PICK_APPWIDGET); ``` 6. 添加 App Widget 到桌面 可以使用以下代码将 App Widget 添加到桌面: ```java // 添加 App Widget Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); context.sendBroadcast(intent); ``` 其中,appWidgetIds 是 App Widget 的 ID 数组,可以在 onUpdate() 方法中获取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值