// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:flutter/semantics.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart'; import '../widgets/semantics_tester.dart'; void main() { testWidgetsWithLeakTracking('Performing SemanticsAction.showOnScreen does not crash if node no longer exist', (WidgetTester tester) async { // Regression test for https://github.com/flutter/flutter/issues/100358. final SemanticsTester semantics = SemanticsTester(tester); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Semantics( explicitChildNodes: true, child: const Text('Hello World'), ), ), ); final int nodeId = tester.semantics.find(find.bySemanticsLabel('Hello World')).id; await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Container(), ), ); // Node with $nodeId is no longer in the tree. expect(semantics, isNot(hasSemantics(TestSemantics(id: nodeId)))); // Executing SemanticsAction.showOnScreen on that node does not crash. // (A platform may not have processed the semantics update yet and send // actions for no longer existing nodes.) tester.binding.performSemanticsAction(SemanticsActionEvent( type: SemanticsAction.showOnScreen, nodeId: nodeId, viewId: tester.view.viewId, )); semantics.dispose(); }); }