Fix `SearchAnchor` triggers unnecessary suggestions builder calls (#143443)
fixes [`SearchAnchor` triggers extra search operations](https://github.com/flutter/flutter/issues/139880) ### Code sample <details> <summary>expand to view the code sample</summary> ```dart import 'package:flutter/material.dart'; Future<List<String>> createFuture() async { return List.generate(1000, (index) => "Hello World!"); } void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( title: 'Flutter Demo', home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { final SearchController controller = SearchController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ SearchAnchor( searchController: controller, suggestionsBuilder: (suggestionsContext, controller) { final resultFuture = createFuture(); return [ FutureBuilder( future: resultFuture, builder: ((context, snapshot) { if (snapshot.connectionState != ConnectionState.done) { return const LinearProgressIndicator(); } final result = snapshot.data; if (result == null) { return const LinearProgressIndicator(); } return ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: result.length, itemBuilder: (BuildContext context, int index) { final root = result[index]; return ListTile( leading: const Icon(Icons.article), title: Text(root), subtitle: Text( root, overflow: TextOverflow.ellipsis, style: TextStyle( color: Theme.of(suggestionsContext) .colorScheme .onSurfaceVariant, ), ), onTap: () {}, ); }, ); }), ), ]; }, builder: (BuildContext context, SearchController controller) { return IconButton( onPressed: () { controller.openView(); }, icon: const Icon(Icons.search), ); }, ), ], ), ), ); } } ``` </details> ### Before https://github.com/flutter/flutter/assets/48603081/69f6dfdc-9f92-4d2e-8a3e-984fce25f9e4 ### After https://github.com/flutter/flutter/assets/48603081/be105e2c-51d8-4cb0-a75b-f5f41d948e5e
Showing
Please register or sign in to comment