在其他 dart 文件/类中清除后,Hive Box 未更新

发布于 2025-01-17 06:21:58 字数 283 浏览 1 评论 0原文

我正在清理一个蜂巢盒并在下一行中更新它。 更新可以在同一个文件代码中看到(通过调试)。 但不知何故,对于其他无状态小部件/类/文件是空的。

boxT.clear() ;
setState(() { 
boxT.addAll({
[count2, totalEntries]
});});

每次按下特定按钮时清除该框的原因:我正在添加地图。 addAll() 只是创建另一个条目。我不想要它。我也尝试过 put 和 putall 但它们只显示值而不是键。

i am clearing a hive box and updating it in the very next line.
The update can be seen in the same file code (through debugging).
But somehow for the other stateless widget/class/file box is empty.

boxT.clear() ;
setState(() { 
boxT.addAll({
[count2, totalEntries]
});});

Reason for clearing the box on everytime a specific button is pressed: I am adding a map. addAll() simply creates another entry. i dont want it. i have also tried put and putall but they are only showing the value and not the key.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

没企图 2025-01-24 06:21:58

这是因为 Hive 不是状态管理工具,如果您向盒子添加/删除某些内容,则需要让状态知道。您应该有一个全局状态来监听来自该 Box 的更改。

ValueNotifier 的示例。


class ItemsNotifier extends ValueNotifier<List<Item>> {
  ItemsNotifier() : super(getItemsFromBox());

  List<Item> _items = getItemsFromBox();

  @override
  List<Item> get value => _items;

  void addItem(Item item) {
    addItemToBox(item);
    _items = getItemsFromBox();
    notifyListeners();
  }

  Future<void> deleteAll() async {
    await clearBox();
    _items = getItemsFromBox();
    notifyListeners();
  }
}

List<Item> getItemsFromBox() {
  return Hive.box<Item>('items').values.toList();
}

Future<void> addItemToBox(Item item) async {
  await Hive.box<Item>('items').add(item);
}

Future<void> clearBox() async {
  await Hive.box<Item>('items').clear();
}

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

  @override
  State<MainPage> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  late final ItemsNotifier _notifier;

  @override
  void initState() {
    _notifier = ItemsNotifier();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ExampleWidget(notifier: _notifier),
      floatingActionButton: FloatingActionButton(
        onPressed: _notifier.deleteAll,
        child: const Icon(Icons.delete),
      ),
    );
  }

  @override
  void dispose() {
    _notifier.dispose();
    super.dispose();
  }
}

class ExampleWidget extends StatelessWidget {
  const ExampleWidget({required this.notifier, Key? key}) : super(key: key);

  final ItemsNotifier notifier;

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder<List<Item>>(
      valueListenable: notifier,
      builder: (context, items, _) {
        return ListView.builder(
          itemBuilder: (context, index) => ListTile(
            title: Text(items[index].title),
          ),
          itemCount: items.length,
        );
      },
    );
  }
}

请注意,如果您有多个页面使用此框中的数据,我建议使用类似 Provider 和使用 ChangeNotifier 而不是 ValueNotifier 或使用 flutter_bloc并拥有一个处理与 Hive 通信的存储库。

That's because Hive is NOT a state management tool, if you add/remove something to/from your box, you need to let your state know. You should have a global state that listens to changes from that Box.

Example with a ValueNotifier.


class ItemsNotifier extends ValueNotifier<List<Item>> {
  ItemsNotifier() : super(getItemsFromBox());

  List<Item> _items = getItemsFromBox();

  @override
  List<Item> get value => _items;

  void addItem(Item item) {
    addItemToBox(item);
    _items = getItemsFromBox();
    notifyListeners();
  }

  Future<void> deleteAll() async {
    await clearBox();
    _items = getItemsFromBox();
    notifyListeners();
  }
}

List<Item> getItemsFromBox() {
  return Hive.box<Item>('items').values.toList();
}

Future<void> addItemToBox(Item item) async {
  await Hive.box<Item>('items').add(item);
}

Future<void> clearBox() async {
  await Hive.box<Item>('items').clear();
}

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

  @override
  State<MainPage> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  late final ItemsNotifier _notifier;

  @override
  void initState() {
    _notifier = ItemsNotifier();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ExampleWidget(notifier: _notifier),
      floatingActionButton: FloatingActionButton(
        onPressed: _notifier.deleteAll,
        child: const Icon(Icons.delete),
      ),
    );
  }

  @override
  void dispose() {
    _notifier.dispose();
    super.dispose();
  }
}

class ExampleWidget extends StatelessWidget {
  const ExampleWidget({required this.notifier, Key? key}) : super(key: key);

  final ItemsNotifier notifier;

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder<List<Item>>(
      valueListenable: notifier,
      builder: (context, items, _) {
        return ListView.builder(
          itemBuilder: (context, index) => ListTile(
            title: Text(items[index].title),
          ),
          itemCount: items.length,
        );
      },
    );
  }
}

Note that if you have multiple pages using the data from this box, I would recommend using something like Provider and having a ChangeNotifier instead of the ValueNotifier or using flutter_bloc and having a Repository that handles communication with Hive.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文