{
  "filename": "lib/order_feed.dart",
  "rule": "- name: screen-disposes-owned-work\n  where: \"lib/order_feed.dart\"\n  ensure: >-\n    dispose must cancel both the stream subscription and periodic timer before calling super.dispose.",
  "corrected": "import 'dart:async';\nimport 'package:flutter/widgets.dart';\n\nclass OrderFeed extends StatefulWidget {\n  final Stream<String> updates;\n  const OrderFeed({super.key, required this.updates});\n  @override State<OrderFeed> createState() => OrderFeedState();\n}\nclass OrderFeedState extends State<OrderFeed> {\n  StreamSubscription<String>? subscription;\n  Timer? timer;\n  String latest = '';\n  int generation = 0;\n  void subscribe() {\n    final current = ++generation;\n    subscription = widget.updates.listen((value) {\n      if (mounted && current == generation) setState(() { latest = value; });\n    });\n  }\n  @override void initState() {\n    super.initState();\n    subscribe();\n    timer = Timer.periodic(const Duration(seconds:30), (_) { if (mounted) setState(() {}); });\n  }\n  @override void didUpdateWidget(covariant OrderFeed oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.updates != widget.updates) {\n      generation++; subscription?.cancel(); latest = ''; subscribe();\n    }\n  }\n  @override void dispose() {\n    generation++;\n    subscription?.cancel();\n    timer?.cancel();\n    super.dispose();\n  }\n  @override Widget build(BuildContext context) => Text(latest);\n}\n",
  "broken": "import 'dart:async';\nimport 'package:flutter/widgets.dart';\n\nclass OrderFeed extends StatefulWidget {\n  final Stream<String> updates;\n  const OrderFeed({super.key, required this.updates});\n  @override State<OrderFeed> createState() => OrderFeedState();\n}\nclass OrderFeedState extends State<OrderFeed> {\n  StreamSubscription<String>? subscription;\n  Timer? timer;\n  String latest = '';\n  int generation = 0;\n  void subscribe() {\n    final current = ++generation;\n    subscription = widget.updates.listen((value) {\n      if (mounted && current == generation) setState(() { latest = value; });\n    });\n  }\n  @override void initState() {\n    super.initState();\n    subscribe();\n    timer = Timer.periodic(const Duration(seconds:30), (_) { if (mounted) setState(() {}); });\n  }\n  @override void didUpdateWidget(covariant OrderFeed oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.updates != widget.updates) {\n      generation++; subscription?.cancel(); latest = ''; subscribe();\n    }\n  }\n  @override void dispose() {\n    generation++;\n    super.dispose();\n  }\n  @override Widget build(BuildContext context) => Text(latest);\n}\n",
  "regression": [
    "    subscription?.cancel();\n    timer?.cancel();\n",
    ""
  ],
  "test_scenarios": [
    [
      "Mounted feed",
      "Current updates shown"
    ],
    [
      "Screen removed",
      "Timer and subscription canceled"
    ],
    [
      "Late buffered callback",
      "mounted check prevents update"
    ],
    [
      "Stream dependency changes",
      "Old subscription replaced in didUpdateWidget"
    ]
  ],
  "test_source": null,
  "test_command": "flutter test test/order_feed_test.dart"
}