【问题标题】:flutter: doesn't embed data from function to list颤振:不将数据从函数嵌入到列表
【发布时间】:2020-06-16 20:15:09
【问题描述】:

我想创建一个列表,那些人位置 = "Barishal"。这就是为什么我创建了一个函数并尝试将数据(我从 getSpecific() 函数获得的数据)推送到一个新列表( myList )。但它产生了一个问题....

这是我的代码-

class BookData extends ChangeNotifier {


  List<MyModel> data = [
    MyModel(name: "Abir", location: "Dhaka"),
    MyModel(name: "Shuvro", location: "Barishal"),
    MyModel(name: "Anik", location: "Barishal")
  ];

 List<MyModel> get getMydata{
   return data;
 }



 getSpecific (){
 for(int i=0;i<data.length;i++){
   if(data[i].location=="Barishal"){
     print(data[i]);
     return data[i];
   }
   }

 }

 List myList = getSpecific();


}

我该如何解决这个问题?

【问题讨论】:

    标签: list flutter


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    您可以提供搜索字符串并使用UnmodifiableListView&lt;MyModel&gt; 并使用_myData.where 进行过滤

    代码sn-p

    class BookData extends ChangeNotifier {
      final List<MyModel> _myData = [
        MyModel(name: "Abir", location: "Dhaka"),
        MyModel(name: "Shuvro", location: "Barishal"),
        MyModel(name: "Anik", location: "Barishal")
      ];
    
      String _searchString = "";
    
      UnmodifiableListView<MyModel> get books => _searchString.isEmpty
          ? UnmodifiableListView(_myData)
          : UnmodifiableListView(
              _myData.where((dog) => dog.location.contains(_searchString)));
    
      void getSpecific(String searchString) {
        _searchString = searchString;
        print(_searchString);
        notifyListeners();
      }
    }
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    import 'package:flutter/cupertino.dart';
    import 'dart:collection';
    import 'package:provider/provider.dart';
    
    class BookData extends ChangeNotifier {
      final List<MyModel> _myData = [
        MyModel(name: "Abir", location: "Dhaka"),
        MyModel(name: "Shuvro", location: "Barishal"),
        MyModel(name: "Anik", location: "Barishal")
      ];
    
      String _searchString = "";
    
      UnmodifiableListView<MyModel> get books => _searchString.isEmpty
          ? UnmodifiableListView(_myData)
          : UnmodifiableListView(
              _myData.where((dog) => dog.location.contains(_searchString)));
    
      void getSpecific(String searchString) {
        _searchString = searchString;
        print(_searchString);
        notifyListeners();
      }
    }
    
    class MyModel {
      final String name;
      final String location;
    
      MyModel({this.name, this.location});
    }
    
    void main() {
      runApp(
        ChangeNotifierProvider(
          create: (context) => BookData(),
          child: MyApp(),
        ),
      );
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      final _controller = TextEditingController();
      String _searchText;
    
      @override
      void initState() {
        _controller.addListener(
          () {
            setState(() {
              _searchText = _controller.text;
            });
          },
        );
        super.initState();
      }
    
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Example',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Example'),
            ),
            body: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                TextField(
                  controller: _controller,
                  decoration: InputDecoration(
                    hintText: "Search",
                    prefixIcon: Icon(Icons.search),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.all(
                        Radius.circular(4.0),
                      ),
                    ),
                  ),
                  onChanged: (value) {
                    Provider.of<BookData>(context, listen: false)
                        .getSpecific(value);
                  },
                ),
                Consumer<BookData>(builder: (context, bookData, child) {
                  print(bookData.books.toString());
                  return Expanded(
                    child: ListView.builder(
                        shrinkWrap: true,
                        itemCount: bookData.books.length,
                        itemBuilder: (context, index) => Card(
                              elevation: 3,
                              child: ListTile(
                                title: Text(bookData.books[index].name),
                              ),
                            )),
                  );
                }),
              ],
            ),
          ),
        );
      }
    }
    

    【讨论】:

      【解决方案2】:

      当需要过滤列表时,可以使用where方法。

      这是一个简单的例子。

      List<MyModel> myNewList = data.where((item) => item.location == "Barishal").toList();
      

      无论如何,您的代码似乎只返回第一项,而不是列表。

      【讨论】:

      • 这样的数据有错误[1]:i.stack.imgur.com/uomOK.png
      【解决方案3】:

      我修复了您的代码,如下所示

      List<MyModel> getSpecific (){
        List<MyModel> result = [];
        for(int i=0;i<data.length;i++){
          if(data[i].location=="Barishal"){
            print(data[i]);
            result.add(data[i]);
          }
        }
        return result;
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-27
        • 2020-06-23
        • 2020-12-11
        • 2020-07-23
        • 2021-07-27
        • 2020-11-17
        • 1970-01-01
        • 2021-06-05
        相关资源
        最近更新 更多