Flutter 在null上调用了getter项

Flutter 在null上调用了getter项,flutter,listview,dart,flutter-provider,flutter-futurebuilder,Flutter,Listview,Dart,Flutter Provider,Flutter Futurebuilder,我正在开发一个简单的ListView应用程序,它可以从互联网上填充,并使用Provider存储在数据库中。但是ListView没有被填充。它在items getter上变为null。但在我和消费者改变之后 现在我得到一个错误,getter项被调用为null 堆栈溢出 ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (155

我正在开发一个简单的ListView应用程序,它可以从互联网上填充,并使用Provider存储在数据库中。但是ListView没有被填充。它在items getter上变为null。但在我和消费者改变之后

现在我得到一个错误,getter项被调用为null

堆栈溢出

 ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (15505): The following NoSuchMethodError was thrown building FutureBuilder<void>(dirty, state:
I/flutter (15505): _FutureBuilderState<void>#7948f):
I/flutter (15505): The getter 'items' was called on null.
I/flutter (15505): Receiver: null
I/flutter (15505): Tried calling: items
I/flutter (15505): 
I/flutter (15505): The relevant error-causing widget was:
I/flutter (15505):   FutureBuilder<void>
I/flutter (15505):   file:///C:/Users/Admin/lib/main.dart:27:13
I/flutter (15505): 
I/flutter (15505): When the exception was thrown, this was the stack:
I/flutter (15505): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
I/flutter (15505): #1      _MyAppState.build.<anonymous closure> (package:list_cart_interview/main.dart:37:33)
I/flutter (15505): #2      _FutureBuilderState.build (package:flutter/src/widgets/async.dart:751:55)
I/flutter (15505): #3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4744:28)
I/flutter (15505): #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4627:15)
I/flutter (15505): #5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart

══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
I/FLIFT(15505):在building FutureBuilder(脏,状态)中引发了以下NoSuchMethodError:
I/颤振(15505):_FutureBuilderState#7948f):
I/flatter(15505):getter“items”被调用为null。
I/颤振(15505):接收器:空
I/颤振(15505):尝试呼叫:项目
I/颤振(15505):
I/颤振(15505):导致错误的相关小部件是:
I/颤振(15505):FutureBuilder
I/颤振(15505):file:///C:/Users/Admin/lib/main.dart:27:13
I/颤振(15505):
I/flatter(15505):当抛出异常时,这是堆栈:
I/颤振(15505):#0 Object.noSuchMethod(dart:core patch/Object_patch.dart:51:5)
I/flatter(15505):#1_MyAppState.build。(套餐:列表、购物车、访谈/主菜单。dart:37:33)
I/flatter(15505):#2 FutureBuilderState.build(包:flatter/src/widgets/async.dart:751:55)
I/flatter(15505):#3 StatefulElement.build(包:flatter/src/widgets/framework.dart:4744:28)
I/flatter(15505):#4 ComponentElement.performRebuild(包:flatter/src/widgets/framework.dart:4627:15)
I/flatter(15505):#5 StatefulElement.performRebuild(包:flatter/src/widgets/framework.dart
main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'models/product.dart';
import 'provider/product_provider.dart';
import 'widgets/list_item.dart';

void main() {
  runApp(
    MaterialApp(
      home: ChangeNotifierProvider.value(
        value: ProductsProvider(),
        child: MyApp(),
      ),
    ),
  );
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder(
          future: Provider.of<ProductsProvider>(context, listen: false)
              .getProducts(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }

            print(snapshot.data.items.length);
            if (snapshot.connectionState == ConnectionState.done) {
              return Consumer<ProductsProvider>(
                child: Center(
                  child: CircularProgressIndicator(),
                ),
                builder: (context, productProvider, child) =>
                    productProvider.items.length <= 0
                        ? child
                        : ListView.builder(
                            itemCount: productProvider.items.length,
                            itemBuilder: (context, index) {
                              return ListItem();
                            },
                          ),
              );
            }
            return Container();
          }),
    );
  }
}

import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
import 'package:list_cart_interview/hellper/sqlite_helper.dart';
import 'dart:convert';
import '../models/product.dart';

class ProductsProvider with ChangeNotifier {
  List<Products> _items = [];

  List get items {
    return [..._items];
  }

  Future<void> getDataFromInternet() async {
    try {
      Response response = await get('https://jsonkeeper.com/b/YIDG');

      Map<String, dynamic> extractedData = jsonDecode(response.body);

      final length = extractedData['data']['products'].length;
      print(length);

      for (int i = 0; i < length; i++) {
        DatabaseHelper.insert({
          'id': extractedData['data']['products'][i]['prodCode'],
          'prodName': extractedData['data']['products'][i]['prodName'],
          'prodImage': extractedData['data']['products'][i]['prodImage'],
          'prodPrice': extractedData['data']['products'][i]['prodPrice'],
          'cartQuantity': 0,
        });
      }
    } catch (error) {
      throw (error);
    }
  }

  Future getProducts() async {
    await getDataFromInternet();
    final productsList = await DatabaseHelper.getProductsFromDB();
    print(" hbj ${productsList}");

    _items = productsList
        .map(
          (item) => Products(
            item['id'],
            item['prodName'],
            item['prodImage'],
            item['prodPrice'],
            item['cartQuantity'],
          ),
        )
        .toList();
    print('-items: ${_items}');
    notifyListeners();
  }
}

导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“模型/产品.省道”;
导入“provider/product_provider.dart”;
导入“widgets/list_item.dart”;
void main(){
runApp(
材料聚丙烯(
主页:ChangeNotifierProvider.value(
值:ProductsProvider(),
子项:MyApp(),
),
),
);
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:未来建设者(
future:Provider.of(上下文,侦听:false)
.getProducts(),
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.waiting){
返回中心(
子对象:CircularProgressIndicator(),
);
}
打印(快照、数据、项目、长度);
if(snapshot.connectionState==connectionState.done){
退货消费者(
儿童:中心(
子对象:CircularProgressIndicator(),
),
生成器:(上下文、产品提供者、子项)=>
productProvider.items.length产品(
项目['id'],
项目['prodName'],
项目['prodImage'],
项目['prodPrice'],
项目['cartQuantity'],
),
)
.toList();
打印('-items:${u items}');
notifyListeners();
}
}
我认为getProducts()方法在上述代码中造成了问题。
现在,这个小部件是唯一的孩子。请帮助在访问项目之前,您需要检查您的
快照.data
是否有数据

if(snapshot.hasData) {
  // return your ListView
}


尽量避免在FutureBuilder中使用提供程序。
未来建设者取决于未来,即最终返回一个值。
在您的情况下,提供程序调用
notifyListeners();
并以此结束。
没有返回任何内容。
如果您希望使用项目列表,请使用侦听更改的使用者。

如果绝对需要使用FutureBuilder,请让您的
getProducts()
方法返回一些值,以便
FutureBuilder
可以使用。

例如,您可以根据是否获取数据返回一个布尔值。

我已经检查过,它为空,没有实际值。这就是问题所在。当我尝试映射项目时,它不会传递给_项目。