Forum Discussion

michelperez's avatar
7 years ago

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!!

2 Replies

  • renojim's avatar
    renojim
    Community Streaming Expert
    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
  • 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!!!!