Estoy trabajando para agregar un elemento de colapso de arranque con un mapa de folleto contenido dentro de él para poder alternar abrir/cerrar la vista del mapa. Sin embargo, el tamaño del mapa del folleto se modifica al inicializar la aplicación y no cambia de tamaño cuando se abre el elemento colapsado. Por lo tanto, el mapa resultante que se muestra cuando se activa es en su mayoría solo un cuadro gris. Después de investigar un poco, parece que tengo que llamar a la función invalidateSize en mi mapa después de abrir el elemento de colapso. Sin embargo, no estoy seguro de cómo ejecutar este comando javascript en mi aplicación Plotly-Dash. Esto es lo que tengo actualmente.
import dash import dash_bootstrap_components as dbc import dash_core_components as dcc import dash_html_components as html import dash_leaflet as dl from dash.dependencies import Input, Output, State map_collapse = dbc.Collapse( html.Div( [ dl.Map( [ dl.TileLayer(), dl.LocateControl(options={'locateOptions': {'enableHighAccuracy': True}}) ], id="map", style={'width': '100%', 'height': '50vh', 'margin': "auto", "display": "block"} ) ] ), id="map-collapse", is_open=False, style={ 'width': '800px', 'height': '400px' } ) collapse_button = dbc.Button( "Open collapse", id="collapse-button", className="mb-3", color="primary", n_clicks=0, ) app.layout = html.Div( [ collapse_button , map_collapse ] ) @app.callback( Output("map-collapse", 'is_open'), [Input("collapse-button", "n_clicks")], [State("map-collapse", "is_open")] ) def toggle_collapse(n, is_open): if n: return not is_open return True if __name__ == '__main__': app.title = 'Dash App' app.run_server(debug=True)¡Cualquier ayuda será apreciada!
Una forma posible de evitar este problema es retrasar el renderizador de mapas (inicial) hasta que el contenedor principal se vuelva visible. Aquí hay una ilustración de cómo ese enfoque podría implementarse para su ejemplo,
import dash import dash_bootstrap_components as dbc import dash_html_components as html import dash_leaflet as dl from dash.dependencies import Input, Output, State def render_map(): return dl.Map([ dl.TileLayer(), dl.LocateControl(options={'locateOptions': {'enableHighAccuracy': True}}) ], id="map", style={'width': '100%', 'height': '50vh', 'margin': "auto", "display": "block"}) app = dash.Dash(external_stylesheets=[dbc.themes.BOOTSTRAP], prevent_initial_callbacks=True) map_collapse = dbc.Collapse(id="map-collapse", is_open=False, style={'width': '800px', 'height': '400px'}) collapse_button = dbc.Button( "Open collapse", id="collapse-button", className="mb-3", color="primary", n_clicks=0, ) app.layout = html.Div( [ collapse_button, map_collapse ] ) @app.callback( Output("map-collapse", 'is_open'), [Input("collapse-button", "n_clicks")], [State("map-collapse", "is_open")] ) def toggle_collapse(_, is_open): return not is_open @app.callback( Output("map-collapse", 'children'), [Input("map-collapse", "is_open")], [State("map-collapse", "children")] ) def render_map_on_show(_, children): if children is not None: return dash.no_update return render_map() if __name__ == '__main__': app.title = 'Dash App' app.run_server()