Preserve selected feature tab in Performance page exports (#9861)

* Preserve selected feature tab in Performance page exports

The Performance page tracked the selected feature tab via
`selectedFeatureTabIndex`, but it was never persisted to offline exports,
so loading exported data always reset to the first tab.

Mirror the Memory page's existing behavior: serialize the selected tab
index into `OfflinePerformanceData` and restore it when loading offline
data so the user lands on the tab they exported from.

Closes #5150

* Honor and clamp the restored tab index when loading offline data

Address review feedback on the offline tab restoration:

- The restored selectedFeatureTabIndex was immediately reset to 0 by the
  default-feature activation in TabbedPerformanceView. Use the restored
  index (clamped to the available tabs) when activating the default
  feature instead of hardcoding 0.
- The number of visible tabs can be smaller when loading offline data
  than when it was exported, so an out-of-range index could be passed to
  AnalyticsTabbedView. Clamp the index passed as initialSelectedIndex.
- Add a round-trip test for a non-zero selectedTab.

* Add release note for performance export tab fix
6 files changed
tree: a1edacab571f64fd3ce2db803a43210f9c4b26e2
  1. .agents/
  2. .gemini/
  3. .github/
  4. .vscode/
  5. _markdown_images/
  6. docs/
  7. packages/
  8. third_party/
  9. tool/
  10. .gitattributes
  11. .gitignore
  12. AGENTS.md
  13. analysis_options.yaml
  14. AUTHORS
  15. BETA_TESTING.md
  16. CLAUDE.md
  17. CODE_OF_CONDUCT.md
  18. CODEOWNERS
  19. CONTRIBUTING.md
  20. DEBUGGING.md
  21. devtools_options.yaml
  22. DOCUMENTATION.md
  23. flutter-candidate.txt
  24. LICENSE
  25. pubspec.lock
  26. pubspec.yaml
  27. README.md
  28. STYLE.md
  29. TESTING.md
  30. TRIAGE.md
README.md

Dart & Flutter DevTools

Build Status OpenSSF Scorecard

What is this?

Dart & Flutter DevTools is a suite of performance tools for Dart and Flutter.

Getting started

For documentation on installing and trying out DevTools, please see our docs.

Contributing and development

Contributions welcome! See our contributing page for an overview of how to build and contribute to the project.

Terms and Privacy

By using Dart DevTools, you agree to the Google Terms of Service. To understand how we use data collected from this service, see the Google Privacy Policy.