Primefaces - Passar objeto para p:dialog

Estou com um problema em um projeto, sou novo no java web e primefaces e preciso de uma ajuda. no qual eu clico em um botão de uma picklist, e as informações do item são exibidas no dialog.
O primeiro click sempre resulta em um objeto null pois os eventos estão acontecendo na ordem errada.

Primeiro ocorre o evento do click do botão, que exibe o dialog e depois o select do item da lista que popula o objeto.

A picklist:

<p:pickList id="pickList"
    value="#{controller.listaSerivcosModel}" var="s"
    itemValue="#{s}" responsive="true" showSourceFilter="true"
    showTargetFilter="true" converter="servicoConverter">
    
    <p:ajax event="select" listener="#{controller.onSelect}" />
    
    <p:column style="width:90%;">
        <h:outputText id="txtServ" value="#{s.descricao}" />

    </p:column>

    <p:column>

        <p:commandButton id="btnDetalhes"
            oncomplete="PF('detalhesOP').show()" update="@form"
            icon="fa fa-search" styleClass="ui-button-cancelar"
            action="#{controller.prepararDetalhesServico(s.id) }">
            <p:tooltip id="toolTipContent" for="btnDetalhes">
                <p:panelGrid id="gridDetalhes" columns="2">
                    <p:outputLabel value="#{bundle.Id}" />
                    <h:outputText value="#{s.id}" />
                </p:panelGrid>
            </p:tooltip>

        </p:commandButton>
    </p:column>
</p:pickList>

<p:dialog id="detalhesPanel" widgetVar="detalhesOP"
    showCloseIcon="true">

    <p:outputPanel>
        <p:panelGrid id="gridDetalhes2" columns="2">
            <p:outputLabel value="#{bundle.Id}" />
            <h:outputText value="#{controller.objeto.id}" />
        </p:panelGrid>
    </p:outputPanel>
</p:dialog>

A controller:

public void prepararDetalhesServico(Servico s) {
	mostrarDetalhes = true;

}


public void onSelect(SelectEvent event) {
	if(mostrarDetalhes){
		objeto = (Servico) event.getObject();
	}
	mostrarDetalhes = false;
}