gpt4 book ai didi

android - flutter - NoSuchMethodError

转载 作者:行者123 更新时间:2023-12-03 03:05:54 29 4
gpt4 key购买 nike

我正在做 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com