def METHOD_NAME(self, key, value) -> None:
    """
    Based on query param value's type and value, update instance's dynamic/static params.
    """
    if isinstance(value, str):
        # Coerce `True` boolean.
        if value.lower() == 'true':
            value = True
        # Coerce `False` boolean.
        elif value.lower() == 'false':
            value = False
        # Query parameters cannot have a `None` (or `null` in JSON) type, convert
        # `None` types to `'null'` so that ?key=null is used in the query URL.
        elif value is None:
            value = 'null'
    # Check type of `value` again, since it may have changed.
    if isinstance(value, str):
        if value.startswith('$'):
            # A value starting with `$` indicates a dynamic query param, where the
            # initial value is unknown and will be updated at the JavaScript layer
            # as the related form field's value changes.
            field_name = value.strip('$')
            self.dynamic_params[field_name] = key
        else:
            # A value _not_ starting with `$` indicates a static query param, where
            # the value is already known and should not be changed at the JavaScript
            # layer.
            if key in self.static_params:
                current = self.static_params[key]
                self.static_params[key] = [v for v in set([*current, value])]
            else:
                self.static_params[key] = [value]
    else:
        # Any non-string values are passed through as static query params, since
        # dynamic query param values have to be a string (in order to start with
        # `$`).
        if key in self.static_params:
            current = self.static_params[key]
            self.static_params[key] = [v for v in set([*current, value])]
        else:
            self.static_params[key] = [value]