从2019年开始,我正在尝试遵循最佳做法,从哪里开始观察片段中的LiveData
,以及是否应该将this
或viewLifecycleOwner
作为参数传递给{ {1}}方法。
根据此Google official documentation,我应该在observe()
中观察到传递onActivityCreated()
(片段)作为参数。
根据此Google sample,我应该在this
中观察到传递onViewCreated()
作为参数。
根据此I/O video,我不应该使用viewLifecycleOwner
,而应该使用this
,但是没有指定应该从哪里开始观察。
根据这个陷阱post,我应该在viewLifecycleOwner
中观察并使用onActivityCreated()
。
那么,我应该从哪里开始观察?我应该使用viewLifecycleOwner
还是this
?
答案 0 :(得分:0)
您是在import {
BaseEntity,
Column,
Entity,
Index,
JoinColumn,
JoinTable,
ManyToMany,
ManyToOne,
OneToMany,
OneToOne,
PrimaryColumn,
PrimaryGeneratedColumn,
RelationId
} from 'typeorm';
import { Resource } from './resource';
import { Skill } from './skill';
@Entity('resource_skill', { schema: 'cccalpha1' })
export class ResourceSkill {
@Column('uuid', {
nullable: false,
primary: true,
default: () => 'uuid_generate_v4()',
name: 'id'
})
id: string;
@ManyToOne(type => Resource, resource => resource.resource_skill, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'resource_id' })
resource: Resource | null;
@ManyToOne(type => Skill, skill => skill.resource_skill, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'skill_id' })
skill: Skill | null;
}
还是onViewCreated
上进行都没关系。片段膨胀时都会调用两者,首先onActivityCreated
,然后是onViewCreated
。这实际上是一个偏好问题。
onActivityCreated
对象使用一个LiveData
,并且LifecycleOwner
和Fragment
都实现了该接口,因此您只需要传递Activity
。
答案 1 :(得分:0)
正如Yigit在I / O谈话中所说,Fragment及其视图具有不同的生命周期。您需要确定您的LiveData
是否与片段或其视图相关,然后传递所需的片段。编译器将接受两者,因为两者都是LifecycleOwner
答案 2 :(得分:0)
如果从活动中观察,则可以在onCreate()
上观察,并按here的说明将this
用于LifecycleOwner:
如果您的生命周期感知组件已与活动的生命周期挂钩,则它将收到ON_CREATE事件。使用@OnLifecycleEvent注释的方法将被调用,以便您的生命周期感知组件可以执行创建状态所需的任何设置代码。
现在,如果您正在片段中进行观察,则可以在onViewCreated()
或onActivityCreated()
上观察到,您应该使用getViewLifecycleOwner()
,而here是为什么:
获取一个代表片段的View生命周期的LifecycleOwner。在大多数情况下,这反映了Fragment本身的生命周期,但是在分离的Fragments情况下,Fragment的生命周期可能比View本身的生命周期长得多。