Flutter-按名称查找卡片 [英] Flutter - Find cards by names
本文介绍了Flutter-按名称查找卡片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是新手,我有一个程序可以显示几张纸牌,而且我对如何制作纸牌查找器有疑问,我正在使用以下代码:
_card(字符串词组,){返回SliverToBoxAdapter(子卡:margin:EdgeInsets.only(right:50,left:50,top:20),子:InkWell(onTap :(){},child:Column(children:< Widget> [SizedBox(高度:15.0),填充(填充:EdgeInsets.only(左:15,右:15),子代:文字(短语,样式:TextStyle(fontFamily:"Circular",fontSize:17.0,颜色:Colors.grey [800]),),),SizedBox(高度:15.0),]),),),);}
然后我用它来制作各种卡片:
返回脚手架(身体:堆栈(孩子:[CustomScrollView(物理学:BouncingScrollPhysics(),碎片:< Widget> [_card('Abrir'),_card('Alzar'),_card('Aprender'),_card('Caer'),_card('Cerrar'),_card('Cocinar'),_card('Correr'),_card('Cortar'),_card('Enseñar'),_card('Estar'),_card('Hay'),_card('Levantarse'),_card('Mirar'),_card('Oler'),_card('Saltar'),_card('Sentar'),_card('Ser'),_card('Tocar'),_card('Tomar'),_card('Tropezar'),]),]),);
非常感谢您的帮助
解决方案
以下是使用以下解决方案:
-
完整的源代码,易于复制粘贴
import'package:flutter/material.dart';导入'package:flutter_hooks/flutter_hooks.dart';导入'package:fuzzy/fuzzy.dart';导入'package:hooks_riverpod/hooks_riverpod.dart';void main(){runApp(ProviderScope(子:MaterialApp(debugShowCheckedModeBanner:否,标题:"Flutter演示",主页:HomePage(),),),);}类HomePage扩展了HookWidget {@override窗口小部件build(BuildContext context){最终短语= useProvider(filteredPhrasesProvider);返回脚手架(正文:ListView(物理:BouncingScrollPhysics(),孩子们: [文本域(自动对焦:是的,textAlignVertical:TextAlignVertical.center,装饰:InputDecoration(prefixIcon:图标(Icons.search),hintText:'搜索',),onChanged :(值)=>context.read(searchTermsProvider).state =值,),... phrases.map((phrase)=> _Card(phrase:短语)).toList(),],),);}}_Card类扩展了StatelessWidget {最终的字符串短语;const _Card({关键这个短语}):super(key:key);@override窗口小部件build(BuildContext context){退货卡(边距:EdgeInsets.all(10.0),子:InkWell(onTap :(){},孩子:填充(填充:EdgeInsets.all(15.0),子代:文字(短语,样式:TextStyle(fontFamily:"Circular",fontSize:17.0,颜色:Colors.grey [800],),),),),);}}final searchTermsProvider = StateProvider< String>(((ref)=>'');最终短语Provider = Provider< List< String>>((参考)=>['Abrir','Alzar','Aprender','Caer','Cerrar','Cocinar','Correr','Cortar','Enseñar',"Estar",'干草',"Levantarse",'Mirar','Oler','Saltar','Sentar','Ser','Tocar','Tomar','特罗佩萨尔',],);最后的filteredPhrasesProvider =提供者< List< String>>(((ref){最终短语= ref.watch(phrasesProvider);最终searchTerms = ref.watch(searchTermsProvider).state;返回searchTerms.isEmpty?词组:Fuzzy< String>(短语,选项:FuzzyOptions(阈值:.4)).search(searchTerms).map((结果)=> result.item).toList();});
I am new to flutter and I have a program that shows several cards and I have a question about how to make a card finder, I am using this code:
_card( String phrase, ) { return SliverToBoxAdapter( child: Card( margin: EdgeInsets.only(right: 50, left: 50, top: 20), child: InkWell( onTap: () {}, child: Column(children: <Widget>[ SizedBox(height: 15.0), Padding( padding: EdgeInsets.only(left: 15, right: 15), child: Text( phrase, style: TextStyle( fontFamily: 'Circular', fontSize: 17.0, color: Colors.grey[800]), ), ), SizedBox(height: 15.0), ]), ), ), ); }
and I use this to make the various cards:
return Scaffold( body: Stack(children: [ CustomScrollView(physics: BouncingScrollPhysics(), slivers: <Widget>[ _card('Abrir'), _card('Alzar'), _card('Aprender'), _card('Caer'), _card('Cerrar'), _card('Cocinar'), _card('Correr'), _card('Cortar'), _card('Enseñar'), _card('Estar'), _card('Hay'), _card('Levantarse'), _card('Mirar'), _card('Oler'), _card('Saltar'), _card('Sentar'), _card('Ser'), _card('Tocar'), _card('Tomar'), _card('Tropezar'), ]), ]), );
I really appreciate any help, thanks
解决方案Here is a solution using:
- hooks_riverpod for State Management
- fuzzy for fuzzy search
Full source code for easy copy-paste
import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fuzzy/fuzzy.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; void main() { runApp( ProviderScope( child: MaterialApp( debugShowCheckedModeBanner: false, title: 'Flutter Demo', home: HomePage(), ), ), ); } class HomePage extends HookWidget { @override Widget build(BuildContext context) { final phrases = useProvider(filteredPhrasesProvider); return Scaffold( body: ListView( physics: BouncingScrollPhysics(), children: [ TextField( autofocus: true, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( prefixIcon: Icon(Icons.search), hintText: 'Search', ), onChanged: (value) => context.read(searchTermsProvider).state = value, ), ...phrases.map((phrase) => _Card(phrase: phrase)).toList(), ], ), ); } } class _Card extends StatelessWidget { final String phrase; const _Card({ Key key, this.phrase, }) : super(key: key); @override Widget build(BuildContext context) { return Card( margin: EdgeInsets.all(10.0), child: InkWell( onTap: () {}, child: Padding( padding: EdgeInsets.all(15.0), child: Text( phrase, style: TextStyle( fontFamily: 'Circular', fontSize: 17.0, color: Colors.grey[800], ), ), ), ), ); } } final searchTermsProvider = StateProvider<String>((ref) => ''); final phrasesProvider = Provider<List<String>>( (ref) => [ 'Abrir', 'Alzar', 'Aprender', 'Caer', 'Cerrar', 'Cocinar', 'Correr', 'Cortar', 'Enseñar', 'Estar', 'Hay', 'Levantarse', 'Mirar', 'Oler', 'Saltar', 'Sentar', 'Ser', 'Tocar', 'Tomar', 'Tropezar', ], ); final filteredPhrasesProvider = Provider<List<String>>((ref) { final phrases = ref.watch(phrasesProvider); final searchTerms = ref.watch(searchTermsProvider).state; return searchTerms.isEmpty ? phrases : Fuzzy<String>(phrases, options: FuzzyOptions(threshold: .4)) .search(searchTerms) .map((result) => result.item) .toList(); });
这篇关于Flutter-按名称查找卡片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文