与changeNotifierProvider的摇摆蜂巢

发布于 2025-02-11 08:34:22 字数 1067 浏览 1 评论 0原文

因此,我想使用Hive将笔记存储在日历应用程序中,但是我在一起实施Hive和ChangeNotifierProvider的过程中很努力。如果有人想知道该怎么做。

这是我到目前为止的代码:

    @HiveType(typeId: 0)
class EventsBox extends HiveObject {
  EventsBox({required this.date, required this.eventsList});
  @HiveField(0)
  DateTime date;
  @HiveField(1)
  List<CleanCalendarEvent> eventsList;
}

这是需要的未来提供者:

final hiveProvider = FutureProvider<HiveDB>((_) => HiveDB.create());

class HiveDB {
  var _events;

  HiveDB._create() {}

  static Future<HiveDB> create() async {
    final component = HiveDB._create();
    await component._init();
    return component;
  }

  _init() async {
    Hive.registerAdapter(EventsBoxAdapter());
    this._events = await Hive.openBox<EventsBox>('events');
  }

  storeEvent(EventsBox eventsMap) {
    this._events.put('events', eventsMap);
  }

  EventsBox getEvents() {
    return this._events.get('events');
  }
}

我想使用changeNotifierProvider而不是FutureProvider

So I wanted to use Hive for storing notes in a Calendar app but I am stuggling so much with implementing Hive and a ChangeNotifierProvider together . If anyone has an idea on what to do I would like to see it.

Here is my code until now :

    @HiveType(typeId: 0)
class EventsBox extends HiveObject {
  EventsBox({required this.date, required this.eventsList});
  @HiveField(0)
  DateTime date;
  @HiveField(1)
  List<CleanCalendarEvent> eventsList;
}

And here is the FutureProvider that is needed :

final hiveProvider = FutureProvider<HiveDB>((_) => HiveDB.create());

class HiveDB {
  var _events;

  HiveDB._create() {}

  static Future<HiveDB> create() async {
    final component = HiveDB._create();
    await component._init();
    return component;
  }

  _init() async {
    Hive.registerAdapter(EventsBoxAdapter());
    this._events = await Hive.openBox<EventsBox>('events');
  }

  storeEvent(EventsBox eventsMap) {
    this._events.put('events', eventsMap);
  }

  EventsBox getEvents() {
    return this._events.get('events');
  }
}

I want to use ChangeNotifierProvider and not FutureProvider

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

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

发布评论

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

评论(1

倒带 2025-02-18 08:34:22

提供商框架的目标是在不始终重新创建它们的情况下将依赖项注入您的应用程序。在您的示例中,您拥有hivesb类,它是您要注入应用程序的内容,以供其他各种小部件使用它。

IMO,“提供”依赖关系的一般方法是:

  1. 创建应用程序外部的依赖项实例(通常在main()函数中)
  2. 创建一个提供商,该提供商注入此依赖项对象
  3. 包装您的your 在提供商的情况下,您
  4. 将依赖项对象提供给提供商包装器,
  5. 请使用提供商&lt; distionencyClass&gt; .of(context)在应用程序中需要的任何地方访问依赖项。

让我们看看这是如何应用于您的代码的:

1。设置Hive模型和HivesB

lib/models/event_box.dart

@HiveType(typeId: 0)
class EventsBox extends HiveObject {
  @HiveField(0)
  DateTime date;

  @HiveField(1)
  List<CleanCalendarEvent> eventsList;

  EventsBox({
    required this.date, 
    required this.eventsList,
  });
}

lib/models/hive_db.dart

class HiveDB {
  var _events;

  HiveDB._create() {}

  static Future<HiveDB> create() async {
    final component = HiveDB._create();
    await component._init();
    return component;
  }

  _init() async {
    Hive.registerAdapter(EventsBoxAdapter());
    this._events = await Hive.openBox<EventsBox>('events');
  }

  storeEvent(EventsBox eventsMap) {
    this._events.put('events', eventsMap);
  }

  EventsBox getEvents() {
    return this._events.get('events');
  }
}

在这种情况下,您要“提供”(或注入)hivesb的实例。

2。为您的HIVEDB实例

lib/models/hive_db_provider.dart

class HiveDbProvider extends StatelessWidget {
  final HiveDB db;
  final Widget child;

  const HiveDbProvider({
    Key? key,
    required this.db,
    required this.child,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<HiveDB>.value(
      value: db,
      child: Consumer<AppCache>(
        builder: (context, db, _) {
          return child;
        },
      ),
    );
  }
}

3。创建 3。创建hivedb instaceb in main(main()

lib lib /main.dart

void main() async {
  final HiveDB db = await HiveDB.create();

  runApp(
    MyApp(db: db)
  );
}

...

4。使用提供商

lib/main.dart

...

class MyApp extends StatelessWidget {
  final HiveDB db;

  const PayBuddy({
    Key? key,
    required this.db,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return HiveDbProvider(
      db: db,
      child: CacheProvider(
        cache: cache,
        child: MaterialApp(
          ...
        ),
      ),
    );
  }
}

5。访问“提供”实例提供者在您的应用程序中的任何

位置code> lib/pages/some_screen.dart

import "package:provider/provider.dart";
...

class SomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // Access HiveDB instance
    final hiveDb = Provider<HiveDB>.of(context);

    ...
  }
}

结论

样本使用“ nofollow noreferrer”>提供者软件包使用提供商的用法在颤音中使用。

The goal of the provider framework is to inject dependencies into your app without recreating them all the time. In your example, you have your HiveDB class which is what you want to inject into your app for various other widgets to use it.

IMO, the general approach of "providing" dependencies is:

  1. Create dependency instances outside the app (Typically in the main() function)
  2. Create a provider which injects this dependency object
  3. Wrap your MaterialApp with the provider
  4. Supply your dependency object into the provider wrapper
  5. Use the Provider<DependencyClass>.of(context) to access your dependency wherever you need it in your app.

Let's see how this applies to your code:

1. Setup your Hive models and HiveDB

lib/models/event_box.dart

@HiveType(typeId: 0)
class EventsBox extends HiveObject {
  @HiveField(0)
  DateTime date;

  @HiveField(1)
  List<CleanCalendarEvent> eventsList;

  EventsBox({
    required this.date, 
    required this.eventsList,
  });
}

lib/models/hive_db.dart

class HiveDB {
  var _events;

  HiveDB._create() {}

  static Future<HiveDB> create() async {
    final component = HiveDB._create();
    await component._init();
    return component;
  }

  _init() async {
    Hive.registerAdapter(EventsBoxAdapter());
    this._events = await Hive.openBox<EventsBox>('events');
  }

  storeEvent(EventsBox eventsMap) {
    this._events.put('events', eventsMap);
  }

  EventsBox getEvents() {
    return this._events.get('events');
  }
}

In this case, you want to "provide" (or inject) an instance of HiveDB to your app.

2. Create a provider for your HiveDB instance

lib/models/hive_db_provider.dart

class HiveDbProvider extends StatelessWidget {
  final HiveDB db;
  final Widget child;

  const HiveDbProvider({
    Key? key,
    required this.db,
    required this.child,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<HiveDB>.value(
      value: db,
      child: Consumer<AppCache>(
        builder: (context, db, _) {
          return child;
        },
      ),
    );
  }
}

3. Create HiveDB instance in main()

lib/main.dart

void main() async {
  final HiveDB db = await HiveDB.create();

  runApp(
    MyApp(db: db)
  );
}

...

4. Inject the HiveDB instance using the provider

lib/main.dart

...

class MyApp extends StatelessWidget {
  final HiveDB db;

  const PayBuddy({
    Key? key,
    required this.db,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return HiveDbProvider(
      db: db,
      child: CacheProvider(
        cache: cache,
        child: MaterialApp(
          ...
        ),
      ),
    );
  }
}

5. Access "provided" instance using Provider anywhere in your app

lib/pages/some_screen.dart

import "package:provider/provider.dart";
...

class SomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // Access HiveDB instance
    final hiveDb = Provider<HiveDB>.of(context);

    ...
  }
}

Conclusion

The sample uses the Provider package which simplifies using provider usage in Flutter.

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