android - flutter - NoSuchMethodError

标签 android dart flutter

我正在做 Searchview flutter 中的例子
https://github.com/MageshPandian20/Flutter-SearchView
但我想对 进行更改子项类有一个

最终的字符串名称属性;

就我而言,我有一个 Product 类,所以我必须在这个意义上修改代码。
当我运行应用程序时,我收到以下错误:

I/flutter (18897):在构建 IndexFragment(dirty, state:) 时抛出了以下 NoSuchMethodError:
我/flutter (18897):_SearchListState#4f3d3):
I/flutter (18897):方法 'map' 在 null 上被调用。
I/flutter (18897):接收器:空
I/flutter (18897):尝试调用:map(Closure: (Product) => ChildItem)

我不明白为什么我会得到那个错误。在测试和错误的时刻运行应用程序
在 Debug模式下,一切正常,但由于我运行它的方式而有点慢......
我想我省略了一个小细节,但是当我运行应用程序时,我收到了上面提到的错误。
我希望你能帮助我。谢谢你。

*PS:在 Debug模式下运行应用程序时,请检查产品列表是否为空以及列表中每个项目的属性。

我的代码:

import 'package:carousel_pro/carousel_pro.dart';
import 'package:flutter/material.dart';
import 'package:graphqllapp/data/product_data.dart';
import 'package:graphqllapp/modules/product_presenter.dart';

class IndexFragment extends StatefulWidget {

  IndexFragment({ Key key }) : super(key: key);

  @override
  _SearchListState createState() =>  _SearchListState();

 } 

class _SearchListState extends State<IndexFragment> implements ProductListView
{
  Widget appBarTitle = new Text("Portada", style: new TextStyle(color: Colors.white),);
  Icon actionIcon = new Icon(Icons.search, color: Colors.white,);
  final key = new GlobalKey<ScaffoldState>();
  final TextEditingController _searchQuery = new TextEditingController();
  List<Product> _list;
  bool isSearching;
  String _searchText = "";
  ProductListPresenter _presenter;

  _SearchListState() {
        _presenter = new ProductListPresenter(this);
        _presenter.loadProducts();

    _searchQuery.addListener(() {
      if (_searchQuery.text.isEmpty) {
        setState(() {
          isSearching = false;
          _searchText = "";
        });
      }
      else {
        setState(() {
          isSearching = true;
          _searchText = _searchQuery.text;
        });
      }
    });
  }

  void init() {
    _presenter.loadProducts();  
  }

 @override
  void initState() {
    super.initState();
    init();
    isSearching = false;    
  }


 @override
  Widget build(BuildContext context)  {
   return new Column(
     children: <Widget>[  new Expanded(
          child:  new  SizedBox(
            child: new Carousel(
                     images: [
                       new ExactAssetImage('images/glutamina.jpg'),
                       new ExactAssetImage('images/frasco1.jpg'),
                       new ExactAssetImage('images/frasco.jpg')]
            )
            ),flex: 2),
            new Expanded(
              child:  new Column(children: <Widget>[
              new IconButton(icon: actionIcon, onPressed: () {
            setState(() {
              if (this.actionIcon.icon == Icons.search) {
                this.actionIcon = new Icon(Icons.close, color: Colors.white,);
                this.appBarTitle = new TextField(
                  controller: _searchQuery,
                  style: new TextStyle(
                    color: Colors.white,
                  ),
                  decoration: new InputDecoration(
                      prefixIcon: new Icon(Icons.search, color: Colors.white),
                      hintText: "Search...",
                      hintStyle: new TextStyle(color: Colors.white)
                  ),
                );
                _handleSearchStart();
              } else {
                _handleSearchEnd();
              }
            });
          },),new ListView(
        padding: new EdgeInsets.symmetric(vertical: 8.0),
        children: isSearching ? _buildSearchList() : _buildList(),
      )] ),flex : 4)]);      
  }

  List<ChildItem> _buildList() {
    return _list.map((product) => new ChildItem(product)).toList();
  }

  List<ChildItem> _buildSearchList() {
    if (_searchText.isEmpty) {
      return _list.map((product) => new ChildItem(product)).toList();
    } else {
      List<Product> _searchList = List();
      for (int i = 0; i < _list.length; i++) {
        Product product = _list.elementAt(i);
        if (product.name.toLowerCase().contains(_searchText.toLowerCase())) {
          _searchList.add(product);
        }
      }
      return _searchList.map((product) => new ChildItem(product)).toList();
    }
  }

  void _handleSearchStart() {
    setState(() {
      isSearching = true;
    });
  }

  void _handleSearchEnd() {
    setState(() {
      this.actionIcon = new Icon(Icons.search, color: Colors.white,);
      this.appBarTitle =
      new Text("Search Sample", style: new TextStyle(color: Colors.white),);
      isSearching = false;
      _searchQuery.clear();
    });
  }

  @override
  void onLoadProductsError(String msg) {
    // TODO: implement onLoadProductsError
  }

  @override
  void onLoadProductsFinish(List<Product> products) {
    // TODO: implement onLoadProductsFinish
    _list = products;
  }
}

class ChildItem extends StatelessWidget {
  final Product product;

  ChildItem(this.product);

  @override
  Widget build(BuildContext context) {
    return new ListTile(
      leading: new CircleAvatar(
          child: Image.memory(product.mainImage),
          backgroundColor: Colors.transparent,
        ),
      title: new Text(product.name, style : new TextStyle(fontWeight: FontWeight.bold)),
        subtitle: new Text(product.description) ,
        isThreeLine: true,
      );
  }
} 

产品类别:
import 'dart:async';
import 'dart:typed_data';
import 'dart:convert';

class Product {

 int id;
 String name;
 String description;
 Uint8List mainImage;
 Uint8List firstImage;
 Uint8List secondImage;

 Product({this.id,this.name,this.description,this.mainImage,this.firstImage,this.secondImage});

 Product.fromMap(Map<String,dynamic> map)
 :id = map["id"],
  name = map["name"],
  description = map["description"],
  mainImage = base64.decode(map["main_image"]),
  firstImage = base64.decode(map["first_image"]),
  secondImage = base64.decode(map["second_image"]);  
}

MockProductRepository 类:
import 'dart:async';
import 'dart:convert';

import 'package:flutter/services.dart';
import 'package:graphqllapp/data/product_data.dart';

class MockProductRepository implements ProductRepository {

  @override
  Future<List<Product>> fetchProducts() async {
    // TODO: implement fetchUsers
    String data = await rootBundle.loadString("mockdata/data.json");
    var jsonResult = json.decode(data);
    return (jsonResult['products'] as List).map((p)=> Product.fromMap(p)).toList();
  }
}

主讲类:
import 'package:graphqllapp/data/product_data.dart';
import 'package:graphqllapp/dependency_injection.dart';

abstract class ProductListView {
  void onLoadProductsFinish(List<Product> users);
  void onLoadProductsError(String msg);
}

class ProductListPresenter {

  ProductListView _view;
  ProductRepository _repository;

  ProductListPresenter(this._view){
    _repository = Injector().productRepository;
  }

  void loadProducts(){
    _repository.fetchProducts()
                .then((v)=>_view.onLoadProductsFinish(v))
                .catchError((onError)=>_view.onLoadProductsError("Error to get users: $onError"));
  }
}

最佳答案

该错误似乎是由 _list 引起的正在 null在通过 onLoadProductsFinish 完成初始化之前.只需声明您的 _list带有空( [] )列表,它应该可以工作。

List<Product> _list = [];

关于android - flutter - NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52898792/

相关文章:

dart - 使用抽屉导航并仅更改正文内容的正确方法是什么?

dart - Dart 2 中与隔离的双向通信

Dart 名称冲突解决

android - 在ListView.builder中更改特定的ListTile图标

dart - 如何使用自定义起始位置将 `TabBar` 向左对齐

java - Android DatePicker 和 DateFormat 输出格式为 'mm-dd-yyyy'

android - 底部导航 View 中选定选项卡的颜色

android - 在 Android 4.4 中从图库中选择时进行裁剪

flutter 。如何在列内创建树形图结构

android - 如何自定义 CheckBoxPreference 的布局 (maxLines)?