I have a small annoying problem with updating session_state from within the app. I first initialise the session state variable in the code, then create st.checkbox with default value bound to the variable. This is all working fine. Now, however, when I try to flip the value, it will take two times to tick the checkbox in order to succeed. Code example below:
if 'test' not in st.session_state:
st.session_state['test'] = True
if st.checkbox('Flip the value', value=st.session_state['test']):
st.session_state['test'] = True
else:
st.session_state['test'] = False```
Here’s a solution that uses callbacks to avoid the issue of having to interact with the widget twice:
Code
import streamlit as st
# callback to update 'test' based on 'check'
def flip():
if st.session_state["check"]:
st.session_state["test"] = True
else:
st.session_state["test"] = False
if "test" not in st.session_state:
st.session_state["test"] = True
st.checkbox(
"Flip the switch", value=st.session_state["test"], key="check", on_change=flip
)
st.write(st.session_state["test"])
I actually figured out even easier way to solve this problem when I realised that key=‘test’ sets the session state variable for ‘test’ all by itself So in my original example all that is needed is this:
st.checkbox('Flip the value', key='test')
st.write(st.session_state.test)