Warm tip: This article is reproduced from serverfault.com, please click

search-无法通过Flutter中的SearchDelegate类传递用户数据

(search - can't pass userdata through SearchDelegate class in flutter)

发布于 2020-11-29 08:16:36

在我的搜索页面中,我有userdata想要从前一页获取然后传递到下一页的类/对象(包括用户名,用户地址等),但是我的搜索页面没有将userdata类/对象传递到下一页。为了使其正常工作,我编写了与StatelessWidget以下典型代码相同的代码,但是失败了。在此搜索页面中,如何userdata从上一页获取然后传递到下一页?这是我的代码。在前一页(statefulWidget)中,我制作了一个iconButton来转到搜索页面,如下所示:

  IconButton(icon: Icon(Icons.search),
           onPressed: () async {await showSearch(context: context, 
           delegate: DataSearch(***userdata: userdata***));
                            })

然后,我制作了DataSearch类以在页面上实现搜索;

  class DataSearch extends SearchDelegate<String> {
   ***final Userdata userdata;
    DataSearch({this.userdata});***

   @override
   List<Widget> buildActions(BuildContext context) {
       return   ...     }

   @override
   Widget buildLeading(BuildContext context) {
   return    ...      }

   @override
   Widget buildResults(BuildContext context) {
         ...         }

   @override
   Widget buildSuggestions(BuildContext context) {
     return ListView(
            .....
            onTap: () async {
              if (afields.contains(e)) {
                await Navigator.push(context,
                    MaterialPageRoute(builder: (context) => 
                      NextPage(***userdata: userdata***)));} 
 
Questioner
kyung
Viewed
0
kyung 2020-12-23 20:42:31

userdata通过创建stateful widget而不是search delegate class上面发布的内容,我能够将对象通过此搜索页面传递到下一页

//part of statefulWidget  
class _DataSearchState extends State<DataSearch> {
TextEditingController _searchController = TextEditingController();

@override
void initState() {
  super.initState();
  _searchController.addListener(_onSearchChanged);
}

@override
void dispose() {
  _searchController.removeListener(_onSearchChanged);
  _searchController.dispose();
  super.dispose();
}

Widget build(BuildContext context) {
 return Scaffold(
  body: Column(
    children: [
       TextField(
          controller: _searchController,
          decoration: InputDecoration(prefixIcon: Icon(Icons.search)),
        ),
      ),
     ListView.builder(
          itemCount: resultsList.length,
          itemBuilder: (BuildContext context, int ndx) {
            return ListTile(
                title: Text(resultsList[ndx]),
                onTap: () {
                  Navigator.push(context, 
    MaterialPageRoute(builder: (context) => NextPage(userdata: userdata)));
                });
          }
       }