Coder Social home page Coder Social logo

Comments (18)

haroldolivieri avatar haroldolivieri commented on July 21, 2024 5

IMHO, I don’t think you need more than Hive.watch. You can extend its usage for your own specific implementation (Provider, ScopeModel, InheritedWidget, StreamBuilder).

In my case, I am creating a stream from Hive.watch so I can use a StreamBuilder to observe state changes on specific widgets.

  Stream<List<String>> watchChanges() {
    return Hive.box(boxNameKey)
        .watch(key: recentQueriesKey)
        .map((event) => fetchQueries());
  }

You can create your own ChangeNotifier and observe changes with watch to notifyListeners().

But what I really think is this watch should return the initial value when we listen to a specific key. Currently I have to watch changes and do a separate fetch to receive all values since the very beginning.

from hive.

mikuhl-dev avatar mikuhl-dev commented on July 21, 2024 2

Maybe like

HiveListenable darkMode = HiveListenable(myBox, 'darkMode');

and

ValueListenableBuilder(
  valueListenable: darkMode,
  builder: (BuildContext context, bool darkMode, Widget child) {
    return ListTile(
      title: child,
      trailing: Switch(
        value: darkMode,
        onChanged: (bool changed) {
          myBox.put('darkMode', changed);
          // Or maybe this.darkMode.set(changed);
        },
      ),
    );
  },
  /*
    For this example, Text isnt that expensive,
    but you can put more expensive widgets here
    and they wont constantly rebuild when you want to
    change JUST the switch.
  */
  child: Text('Dark Mode'),
),

from hive.

simc avatar simc commented on July 21, 2024 2

You are right, the reason why I didn't implement that are lazy boxes.

Since lazy boxes don't keep the values in memory, they would need to be fetched for each subscribe call.

I'm not sure how to solve this.
Edit: Maybe using a sendInitialEvent parameter for the watch() method. What do you think?

from hive.

simc avatar simc commented on July 21, 2024 1

This has finally been implemented:

ValueListenableBuilder(
  valueListenable: Hive.box('settings').listenable(),
  builder: (context, box, widget) {
    return Center(
      child: Switch(
        value: box.get('darkMode', defaultValue: false),
        onChanged: (val) => box.put('darkMode', val),
      ),
    );
  },
)

from hive.

simc avatar simc commented on July 21, 2024 1

@MichaelPriebe You can use yourBox.listenable(key: 'someKey')

from hive.

simc avatar simc commented on July 21, 2024

You can just use something like this:

var box = Hive.box('yourBox');
box.watch('yourKey').listen((e) {
  setState(() {});
});

This will update your widget when yourKey changes.

from hive.

mikuhl-dev avatar mikuhl-dev commented on July 21, 2024

setState is not the best practice though, often rebuilds more than what you need.

from hive.

simc avatar simc commented on July 21, 2024

Could you provide a sample of what you have in mind?

from hive.

simc avatar simc commented on July 21, 2024

I understand, thanks...

from hive.

simc avatar simc commented on July 21, 2024

I created the HiveBuilder how do you like it?

Here is a simple example how it works.

from hive.

mikuhl-dev avatar mikuhl-dev commented on July 21, 2024

I was thinking like this:

class HiveNotifier extends ValueNotifier {

  final Box box;
  final String key;
  
  HiveNotifier(this.box, this.key) : super(box.get(key)) {
    box.watch(key: key).listen((BoxEvent event) {
      if (event.value == value) return;
      value = event.value;
    });
  }

  @override
  get value => box.get(key);

  @override
  set value(newValue) {
    box.put(key, value);
    notifyListeners();
  }

}

Didn't try to see if it works though.

from hive.

simc avatar simc commented on July 21, 2024

IMHO, I don’t think you need more than Hive.watch. You can extend its usage for your own specific implementation (Provider, ScopeModel, InheritedWidget, StreamBuilder).

I agree.

But what I really think is this watch should return the initial value when we listen to a specific key. Currently I have to watch and map to receive all values since the very beginning.

I don't quite undestand what you mean. Do you want to receive all events for a key since the box has been opened? Hive would need to keep them for any key in case you watch that key anytime later.

from hive.

haroldolivieri avatar haroldolivieri commented on July 21, 2024

Sorry, I’ve updated my comment.

I would like that watch had a seedValue for the time I subscribe to it, but only when I am listening to a specific key, like a snapshot.

Otherwise I have to do listen and fetch for the first content not be null, as you do on WatchBoxWidget, this shouldn’t be necessary.

from hive.

haroldolivieri avatar haroldolivieri commented on July 21, 2024

What about an optional param where we can ask for this initialValue? So it would not be a problem to fetch it again for lazyBox under the hood as in cases like mine we will have to fetch it anyway.

from hive.

haroldolivieri avatar haroldolivieri commented on July 21, 2024

Hahah exactly

from hive.

simc avatar simc commented on July 21, 2024

Okay let's do that 👍

from hive.

mikuhl-dev avatar mikuhl-dev commented on July 21, 2024

Thanks @leisim! Hopefully we can get key listeners too because I would rather widgets not rebuild when an irrelevant setting changes.

from hive.

mikuhl-dev avatar mikuhl-dev commented on July 21, 2024

from hive.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.