繁体   English   中英

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

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

我使用 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);

当我向费用框添加新费用时,一切正常,并且我的费用显示正确。 但是,一旦我热重启,我就会收到以下错误。

这是我显示我的费用清单的代码。

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)),
      ),
    );
  }
}

这是整个错误代码

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 可以很好地处理原始数据类型,如文档https://docs.hivedb.dev/#/custom-objects/type_adapters中所述

但它对您在之前的会话中存储的序列化数据的类型了解不多。 它将能够在 session 期间正确处理实时数据,因为实时数据在 memory 中按原样定义、创建和存储。 但是在其他一些session中序列化和反序列化后,它就无法从原始类型之外的内容中猜出类型。

您必须为 hive 的数据类型创建类型适配器才能正确处理它们,或者您可以手动将反序列化数据转换为您自己的类型。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM