Roku Developer Program

Developers and content creators—a complete solution for growing an audience directly.
cancel
Showing results for 
Search instead for 
Did you mean: 
michelperez
Level 7

How to expose fields obtained inside screen to main thread for a SignIn component

Hi, I'm trying to create a SignIn component, but once I get username and password from the user in my component I can't "export" them back to the main thread. This is what I'm trying right now:
<component name = "SignInScene" extends = "Scene" >
  <script type = "text/brightscript" >
    <![CDATA[
    sub init()
       m.communicator = m.top.findNode("communicator")
       m.communicator.addField("password", "roString", true)
      ...
   end sub

    sub onPasswordKeyboardBtnSelected(roEvent)
     if roEvent.getData() = 0 then
        if m.password <> "" and m.password <> invalid then
            m.communicator.setField("password", m.password)
            ...
        end if
     end if
    end sub

   <children>
     <Label id="communicator"/>
   </children>
</component>


Now, in main.brs I have:


   screen = CreateObject("roSGScreen")
   m.port = [i]CreateObject[/i]("roMessagePort")
    screen.setMessagePort(m.port)
    scene = screen.CreateScene("SignInScene")
    screen.Show()
    
    scene.findNode("communicator").observeField("password", m.port)
    
     while (true)
        msg = wait(0, m.port)
        msgType = type(msg)
        LogToConsole(msgType)
    
        if msgType = "roSGScreenEvent"
          if msg.isScreenClosed() then return
        end if
      end while


When I set field "password" and I try a `getField` after that I get `invalid`, also nothing is caught in the main thread. Basically what I want is a way to pass login data out of the component. Is this the better approach? What am I doing wrong?

Thanks!!
0 Kudos
2 Replies
renojim
Level 8

Re: How to expose fields obtained inside screen to main thread for a SignIn component

I think you're making it more complicated than it needs to be.  Just set the label's text value to the password/username.
<children>
  <Label id="password" translation="[0,0]" text="" visible="false" />
</children>

password = m.top.findNode("password")
...
password.text = "user's password"

In your main thread:
sg = createObject("roSGScreen")
scene = sg.createScene("SignInScene")
sg.Show()
sg.setMessagePort(m.port)
password = scene.findNode("password")
password.observeField("text", m.port)
while(true)
  msg = wait(0,m.port)
  msgType = type(msg)
  print "msgType: ";msgType

  if msgType = "roSGScreenEvent" then
     if msg.isScreenClosed() then
        print "isScreenClosed"
        exit while
     end if
  else if msgType = "roSGNodeEvent" then
     passwordText = password.text
  end if
end while

I hope that's enough to get the point across.  It may not be the best approach, but it works for me.

-JT
0 Kudos
michelperez
Level 7

Re: How to expose fields obtained inside screen to main thread for a SignIn component

Hi renojim,[/color]

Thank you so much!!, that worked like a charm, you are the man!. For some reason I had a hard time finding an answer for this, which seems an obvious workflow, Roku samples from the guide are incomplete they show you how to create a keyboard component or a pin dialog but they don't mention how to interact with it, docs are lacking on that area.

Thanks!!!!
0 Kudos