Tips
how to keep the ndk obj global
If you have a relatively simple app you can initialize ndk in your main method and pass down ndk on the widget tree.
For more more complex applications we recommend using riverpod or simmilar packages/methods (get_it, singletons etc).
riverpod example:
import 'package:ndk/ndk.dart';
import 'package:riverpod/riverpod.dart';
final ndkProvider = Provider<Ndk>((ref) {
final EventSigner eventSigner = Bip340EventSigner("privateKey", "publicKey");
// For Flutter apps targeting web, use NdkEventSigner / NdkEventSignerFactory
// from ndk_flutter for automatic platform selection (fast JS crypto on web,
// pure Dart on native).
final EventVerifier eventVerifier = RustEventVerifier();
final CacheManager cache = MemCacheManager();
final ndkConfig = NdkConfig(
engine: NdkEngine.JIT,
cache: cache,
eventSigner: eventSigner,
eventVerifier: eventVerifier,
);
final ndk = Ndk(ndkConfig);
return ndk;
});
avoid layout shifts
Sometimes, it makes sense to buffer the response from a query and only update the UI periodically.
The package used to achieve this is rxdart.
import 'package:rxdart/rxdart.dart';
import 'package:ndk/ndk.dart';
...
// query
final myquery = ndk.requests.query(
filters: [
Filter(
authors: ['hexPubkey']
kinds: [Nip01Event.TEXT_NODE_KIND],
limit: 10,
),
],
);
myquery.stream
// rxdart
.bufferTime(const Duration(milliseconds: 500))
// if no events are received in 500ms, an empty list is emitted => filter out
.where((events) => events.isNotEmpty)
.listen((events) { // List<Nip01Event>
// update UI
print(events.toString());
});
reduce native WebSocket memory overhead
Native applications can opt out of permessage-deflate negotiation:
final ndk = Ndk(
NdkConfig(
cache: MemCacheManager(),
eventVerifier: Bip340EventVerifier(),
webSocketCompression: false,
),
);
Disabling compression can reduce memory and codec overhead for long-running services, but sends more bytes for compressible traffic and can perform worse on bandwidth-constrained links. Compression remains enabled by default.
Browser WebSocket APIs do not expose compression negotiation controls, so this setting has no effect on web builds.