Change Dropdown Options on_change in Text Input Widget

Hey guys,

I am trying to create this app where users can input a URL and depending on that URL, some other options are populated.

I have 3 inputs:

  • User inputs a URL (this url contains a 3d model with some metadata in it. I am using an external library to access the model and the data in it.)
  • User selects a Category. (This categories gets populated depending on the received data from the URL. I want to cache the received data so when user changes the Category, i don’t receive everything again.)
  • User selects parameter. (The parameters are filtered from the selected category. Again, when any change happens in the category input, i don’t want to rerun the whole script, and use the cached data.)

Question is

How can i populate options on the second dropdown depending on_change in the Text input without running the whole script from scratch and make it as performative as possible?

PS. Dropdown options are fetched from an external database as a list.

I am open to any help? I can even do a Zoom call if needed.

Sample Code

# import streamlit
import streamlit as st

# specklepy libraries
from specklepy.api.wrapper import StreamWrapper
from specklepy.api.client import SpeckleClient
from specklepy.api import operations
from specklepy.objects import Base

#input container
input = st.container()

with input:
    st.subheader("Inputs")
    commit_url = st.text_input(
        "Commit URL",
        "https://latest.speckle.dev/streams/28dd9ad7ba/commits/c50598dcb2",
        key="commit_url",
    )

# WRAPPER🌮
# wrapper
wrapper = StreamWrapper(commit_url)
# client 👨‍🍳
client = wrapper.get_client()
# transport 🚚
transport = wrapper.get_transport()

# COMMIT
# get speckle commit
commit = client.commit.get(wrapper.stream_id, wrapper.commit_id)
# get obj id from commit
obj_id = commit.referencedObject
# receive objects from speckle
commit_data = operations.receive(obj_id, transport)

with input:
    selected_category = st.selectbox(
        "Select Category",
        commit_data.get_dynamic_member_names(),
        key="selected_category",
    )
    parameters = commit_data[selected_category][0][
        "parameters"
    ].get_dynamic_member_names()
    category_elements = commit_data[selected_category]
    selected_parameters = st.multiselect(
        "Select parameters",
        get_parameter_names(commit_data),
        key="selected_parameters",
    )