简体   繁体   English

输入'列表<dynamic> ' 不是类型 'List 的子类型<expense> ? 在类型转换中</expense></dynamic>

[英]type 'List<dynamic>' is not a subtype of type 'List<Expense>?' in type cast

I use Hive to store daily expenses inside expenseBox like this:我使用 Hive 将日常开支存储在 feeBox 中,如下所示:

final String now = DateFormat('yyyyMMdd').format(DateTime.now());
List<Expense> todaysExpenses = Hive.box<List<Expense>>('expenses').get(now, defaultValue: []) as List<Expense>;
todaysExpenses.add(expense);
expenseBox.put(now, todaysExpenses);

When I add a new expense to the expenseBox everything works fine and my expenses are displayed correctly.当我向费用框添加新费用时,一切正常,并且我的费用显示正确。 But as soon as I hot restart I get the following error.但是,一旦我热重启,我就会收到以下错误。

This is my code for displaying My List of Expenses.这是我显示我的费用清单的代码。

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:intl/intl.dart';

import '/models/expense.dart';
import '/screens/add_expense_screen.dart';

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  static const routeName = '/home_page';

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  late Box expenseBox;
  late Box pocketBox;

  List<Expense> mapped = [];

  @override
  void initState() {
    expenseBox = Hive.box<List<Expense>>('expenses');
    pocketBox = Hive.box<int>('pocket');
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: Hive.box<int>('pocket').listenable(),
      builder: (context, Box<int> pocketBox, child) => Scaffold(
        appBar: AppBar(
          title: const Text('Expense Tracker'),
          elevation: 0,
          centerTitle: true,
        ),
        body: NestedScrollView(
          headerSliverBuilder: (context, _) => [
            SliverAppBar(
              expandedHeight: MediaQuery.of(context).size.height * 0.15,
              flexibleSpace: FlexibleSpaceBar(
                background: Container(
                  padding: const EdgeInsets.symmetric(horizontal: 10),
                  child: Row(
                    children: [
                      Expanded(
                        child: Column(
                          mainAxisSize: MainAxisSize.min,
                          children: [
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: [
                                const Text(
                                  'Expense Tracker',
                                  style: TextStyle(
                                      fontSize: 14, color: Colors.white),
                                ),
                                Text(
                                  '${pocketBox.get('budget') ?? 0}',
                                  style: const TextStyle(
                                      fontSize: 18,
                                      color: Colors.white,
                                      fontWeight: FontWeight.bold),
                                ),
                              ],
                            ),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: [
                                const Text(
                                  'Income',
                                  style: TextStyle(
                                      fontSize: 14, color: Colors.white),
                                ),
                                Text(
                                  '${pocketBox.get('totalIncome') ?? 0}',
                                  style: const TextStyle(
                                      fontSize: 18,
                                      color: Colors.white,
                                      fontWeight: FontWeight.bold),
                                ),
                              ],
                            ),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: [
                                const Text(
                                  'Expense',
                                  style: TextStyle(
                                      fontSize: 14, color: Colors.white),
                                ),
                                Text(
                                  '${pocketBox.get('totalExpense') ?? 0}',
                                  style: const TextStyle(
                                      fontSize: 18,
                                      color: Colors.white,
                                      fontWeight: FontWeight.bold),
                                ),
                              ],
                            ),
                          ],
                        ),
                      ),
                      Expanded(child: Container()),
                    ],
                  ),
                ),
              ),
            ),
          ],
          body: ValueListenableBuilder(
            valueListenable: Hive.box<List<Expense>>('expenses').listenable(),
            builder: (context, Box<List<Expense>> expensesBox, child) {
              return ListView.separated(
                separatorBuilder: (context, index) {
                  return const SizedBox(height: 20);
                },
                itemCount: expenseBox.length,
                itemBuilder: (ctx, ind) {
                  final expense = expenseBox.getAt(ind) as List<Expense>;
                  return SizedBox(
                    height: 200,
                    child: ListView.builder(
                      itemCount: expenseBox.getAt(ind).length,
                      itemBuilder: (context, index) {
                        return ListTile(
                          title: Text(expense[index].name),
                          subtitle: Text(DateFormat('yyyyMMdd').format(expense[index].date)),
                        );
                      },
                    ),
                  );
                },
              );
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
            onPressed: () {
              Navigator.of(context).push(MaterialPageRoute(
                builder: (_) => const AddExpenseScreen(
                  index: -1,
                ),
              ));
            },
            child: const Icon(Icons.add)),
      ),
    );
  }
}

This is the whole error code这是整个错误代码

type 'List<dynamic>' is not a subtype of type 'List<Expense>?' in type cast

When the exception was thrown, this was the stack: 
#0      BoxImpl.getAt (package:hive/src/box/box_impl.dart:57:41)
#1      _HomeScreenState.build.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:expense_tracker/screens/home_screen.dart:123:46)
#2      new ListView.separated.<anonymous closure> (package:flutter/src/widgets/scroll_view.dart:1260:34)
#3      SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:457:22)
#4      SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1215:28)
#5      SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1228:55)
#6      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2531:19)
#7      SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1221:12)
#8      RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:349:23)
#9      RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1962:59)
#10     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:910:15)
#11     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1962:14)
#12     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:338:5)
#13     RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:422:5)
#14     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:79:12)
#15     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#16     RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:137:12)
#17     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:371:11)
#18     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#19     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:510:13)
#20     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1580:12)
#21     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1489:20)
#22     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#23     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#24     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#25     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#26     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#27     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#28     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#29     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#30     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#31     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#32     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#33     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#34     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#35     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#36     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#37     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#38     RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:545:11)
#39     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#40     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#41     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#42     RenderSliverFillRemainingWithScrollable.performLayout (package:flutter/src/rendering/sliver_fill.dart:92:14)
#43     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#44     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:510:13)
#45     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1580:12)
#46     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1489:20)
#47     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#48     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#49     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#50     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#51     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#52     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#53     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#54     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#55     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#56     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#57     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#58     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#59     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#60     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#61     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#62     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#63     RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:545:11)
#64     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#65     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#66     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#67     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:12)
#68     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1005:7)
#69     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:240:7)
#70     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:403:14)
#71     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#72     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#74     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#75     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1376:11)
#76     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#77     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#78     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#79     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#80     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#81     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#82     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#83     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#84     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#85     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#86     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#87     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#88     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#89     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#90     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#91     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#92     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#93     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#94     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3428:13)
#95     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#97     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#98     _RenderTheatre.performLayout (package:flutter/src/widgets/overlay.dart:751:15)
#99     RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#100    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#101    RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#102    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#103    RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#104    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#105    RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#106    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#107    RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#108    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#109    RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#110    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#111    RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#112    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#113    RenderObject.layout (package:flutter/src/rendering/object.dart:1852:7)
#114    RenderView.performLayout (package:flutter/src/rendering/view.dart:165:14)
#115    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1707:7)
#116    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:879:18)
#117    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:497:19)
#118    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:883:13)
#119    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#120    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1145:15)
#121    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9)
#122    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:863:7)

Hive can handle primitive data types well as stated in the documents https://docs.hivedb.dev/#/custom-objects/type_adapters Hive 可以很好地处理原始数据类型,如文档https://docs.hivedb.dev/#/custom-objects/type_adapters中所述

But it does not know much about the type of the serialized data you've stored in the previous sessions.但它对您在之前的会话中存储的序列化数据的类型了解不多。 It will be able to handle the live data correctly during the session, since the live data is defined, created and stored as is in the memory at the time.它将能够在 session 期间正确处理实时数据,因为实时数据在 memory 中按原样定义、创建和存储。 But after serialization and deserialization in some other session, it'll not be able to guess the type from the contents beyond the primitive types.但是在其他一些session中序列化和反序列化后,它就无法从原始类型之外的内容中猜出类型。

You'll have to create type adapters for your data types for hive to handle them correctly or you could cast the deserialized data manually to your own types.您必须为 hive 的数据类型创建类型适配器才能正确处理它们,或者您可以手动将反序列化数据转换为您自己的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 I/flutter(2680):输入“列表”<dynamic> &#39; 不是类型 &#39;Map 的子类型<dynamic, dynamic> &#39; 在类型转换中 - I/flutter ( 2680): type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>' in type cast 输入&#39;未来<List<Data> &gt;&#39; 不是 &#39;List 类型的子类型<Data> &#39; 在类型转换中 - type 'Future<List<Data>>' is not a subtype of type 'List<Data>' in type cast 输入'列表<object?> ' 不是类型转换中类型 'List&lt;&gt;' 的子类型</object?> - type 'List<Object?>' is not a subtype of type 'List<>' in type cast 输入'未来<dynamic> ' 不是类型 'List 的子类型<application> ?</application></dynamic> - type 'Future<dynamic>' is not a subtype of type 'List<Application>?' _TypeError(输入&#39;列表<dynamic> &#39; 不是类型 &#39;PlaceDetails&#39; 的子类型) - _TypeError (type 'List<dynamic>' is not a subtype of type 'PlaceDetails') “Null”类型不是“List”类型的子类型<map<String,Object> &gt;&#39; 类型转换 - type 'Null' is not a subtype of type 'List<map<String,Object>>' in type cast 类型列表<dynamic>不是 Map 的子类型<string,dynamic></string,dynamic></dynamic> - type List<dynamic> is not a subtype of Map<String,dynamic> 输入'列表<dynamic> ' 不是类型 'Map 的子类型<dynamic, dynamic> ' 在 flutter 应用程序中</dynamic,></dynamic> - type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>' in flutter app 输入&#39;列表<dynamic> &#39; 不是类型 &#39;Uint8List 的子类型 - type 'List<dynamic>' is not a subtype of type 'Uint8List 颤振:输入&#39;列表<dynamic> &#39; 不是 &#39;List 类型的子类型<DropdownMenuItem<String> &gt;&#39; - flutter: type 'List<dynamic>' is not a subtype of type 'List<DropdownMenuItem<String>>'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM