Frontend and backend out of sync

Hi all,

I have a problem when using a session state implementation for pre-selection of multiselect options.
When I enter some text in the text_input, it changes the session state and does a rerun/sync. After the sync, the front-end and back-end of the checkbox below are out of sync.

Please have a look at my screen cast:

the code for this test app is here:

import re

import streamlit as st

from sessionstate import _get_state

session_state = _get_state()
session_state.input_value = ''

input_value = st.text_input('regex for multiselect', value=session_state.input_value)
session_state.input_value = input_value
session_state.sync()

options = ['test1', 'test2', 'test3', 'test4']
preselected = [x for x in options if re.match(input_value, x) and input_value != '']
multiselect_value = st.multiselect('multiselect', options=options, default=preselected)

st.markdown('Value of multiselect')
st.write(multiselect_value)

checkbox_value = st.checkbox('checkbox', value=True)
st.markdown('Value of checkbox')
st.write(checkbox_value)

the code for the session state is here (found it somewhere in this forum):

from streamlit.report_thread import get_report_ctx
from streamlit.hashing import _CodeHasher
from streamlit.server.server import Server


class _SessionState:

    def __init__(self, session, hash_funcs):
        """Initialize sessionstate instance."""
        self.__dict__["_state"] = {
            "data": {},
            "hash": None,
            "hasher": _CodeHasher(hash_funcs),
            "is_rerun": False,
            "session": session,
        }

    def __call__(self, **kwargs):
        """Initialize state data once."""
        for item, value in kwargs.items():
            if item not in self._state["data"]:
                self._state["data"][item] = value

    def __getitem__(self, item):
        """Return a saved state value, None if item is undefined."""
        return self._state["data"].get(item, None)

    def __getattr__(self, item):
        """Return a saved state value, None if item is undefined."""
        return self._state["data"].get(item, None)

    def __setitem__(self, item, value):
        """Set state value."""
        self._state["data"][item] = value

    def __setattr__(self, item, value):
        """Set state value."""
        self._state["data"][item] = value

    def clear(self):
        """Clear session state and request a rerun."""
        self._state["data"].clear()
        self._state["session"].request_rerun()

    def sync(self):
        """Rerun the app with all state values up to date from the beginning to fix rollbacks."""

        # Ensure to rerun only once to avoid infinite loops
        # caused by a constantly changing state value at each run.
        #
        # Example: state.value += 1
        if self._state["is_rerun"]:
            self._state["is_rerun"] = False
        elif self._state["hash"] is not None:
            if self._state["hash"] != self._state["hasher"].to_bytes(self._state["data"], None):
                self._state["is_rerun"] = True
                self._state["session"].request_rerun()

        self._state["hash"] = self._state["hasher"].to_bytes(self._state["data"], None)


def _get_session():
    session_id = get_report_ctx().session_id
    session_info = Server.get_current()._get_session_info(session_id)

    if session_info is None:
        raise RuntimeError("Couldn't get your Streamlit Session object.")

    return session_info.session


def _get_state(hash_funcs=None):
    session = _get_session()

    if not hasattr(session, "_custom_session_state"):
        session._custom_session_state = _SessionState(session, hash_funcs)

    return session._custom_session_state

anyone? Thanks!