Dart/Flutter SDK
The Dart SDK provides native Redlite bindings for Flutter applications using flutter_rust_bridge.
Installation
Section titled âInstallationâAdd to your pubspec.yaml:
dependencies: redlite: git: url: https://github.com/russellromney/redlite path: sdks/redlite-dartQuick Start
Section titled âQuick Startâimport 'package:redlite/redlite.dart';
void main() async { // Initialize the library await RustLib.init();
// Open an in-memory database final db = Db.openMemory();
// Or open a persistent database // final db = Db.open(path: '/path/to/db.sqlite');
// String operations await db.set_(key: 'name', value: 'Alice'.codeUnits); final name = await db.get_(key: 'name'); print(utf8.decode(name!)); // Alice
// Increment/Decrement await db.incr(key: 'counter'); await db.incrby(key: 'counter', increment: 5);
// Hash operations await db.hset(key: 'user:1', field: 'name', value: 'Bob'.codeUnits); await db.hset(key: 'user:1', field: 'age', value: '30'.codeUnits); final user = await db.hgetall(key: 'user:1');
// List operations await db.lpush(key: 'queue', values: ['task1', 'task2'].map((s) => Uint8List.fromList(s.codeUnits)).toList()); final task = await db.rpop(key: 'queue');
// Set operations await db.sadd(key: 'tags', members: ['redis', 'sqlite'].map((s) => Uint8List.fromList(s.codeUnits)).toList()); final isMember = await db.sismember(key: 'tags', member: 'redis'.codeUnits);
// Sorted set operations await db.zadd(key: 'scores', members: [ ZMember(score: 100.0, member: Uint8List.fromList('player1'.codeUnits)), ZMember(score: 85.0, member: Uint8List.fromList('player2'.codeUnits)), ]); final topPlayers = await db.zrevrange(key: 'scores', start: 0, stop: 9, withScores: true);}API Reference
Section titled âAPI ReferenceâDatabase Operations
Section titled âDatabase Operationsâ// Open databaseDb.open(path: String) // File-based databaseDb.openMemory() // In-memory databaseDb.openWithCache(path: String, cacheMb: int) // With custom cache size
// Database managementdb.dbsize() // Get key countdb.flushdb() // Delete all keysdb.vacuum() // Reclaim spaceString Commands
Section titled âString Commandsâdb.set_(key: String, value: List<int>, ttlSeconds: int?)db.get_(key: String) -> Uint8List?db.getdel(key: String) -> Uint8List?db.mset(pairs: List<(String, Uint8List)>)db.mget(keys: List<String>) -> List<Uint8List?>db.incr(key: String) -> intdb.incrby(key: String, increment: int) -> intdb.incrbyfloat(key: String, increment: double) -> doubledb.decr(key: String) -> intdb.decrby(key: String, decrement: int) -> intdb.append(key: String, value: List<int>) -> intdb.strlen(key: String) -> intdb.getrange(key: String, start: int, end: int) -> Uint8Listdb.setrange(key: String, offset: int, value: List<int>) -> intdb.setex(key: String, seconds: int, value: List<int>)db.psetex(key: String, milliseconds: int, value: List<int>)Key Commands
Section titled âKey Commandsâdb.del(keys: List<String>) -> intdb.exists(keys: List<String>) -> intdb.keyType(key: String) -> KeyTypedb.keys(pattern: String) -> List<String>db.rename(key: String, newkey: String)db.renamenx(key: String, newkey: String) -> booldb.expire(key: String, seconds: int) -> booldb.pexpire(key: String, milliseconds: int) -> booldb.expireat(key: String, unixTime: int) -> booldb.persist(key: String) -> booldb.ttl(key: String) -> intdb.pttl(key: String) -> intdb.scan(cursor: String, pattern: String?, count: int) -> (String, List<String>)Hash Commands
Section titled âHash Commandsâdb.hset(key: String, field: String, value: List<int>) -> intdb.hget(key: String, field: String) -> Uint8List?db.hmset(key: String, mapping: List<(String, Uint8List)>) -> intdb.hmget(key: String, fields: List<String>) -> List<Uint8List?>db.hgetall(key: String) -> List<(String, Uint8List)>db.hdel(key: String, fields: List<String>) -> intdb.hexists(key: String, field: String) -> booldb.hlen(key: String) -> intdb.hkeys(key: String) -> List<String>db.hvals(key: String) -> List<Uint8List>db.hincrby(key: String, field: String, increment: int) -> intdb.hscan(key: String, cursor: String, pattern: String?, count: int) -> (String, List<(String, Uint8List)>)List Commands
Section titled âList Commandsâdb.lpush(key: String, values: List<Uint8List>) -> intdb.rpush(key: String, values: List<Uint8List>) -> intdb.lpop(key: String, count: int?) -> List<Uint8List>db.rpop(key: String, count: int?) -> List<Uint8List>db.llen(key: String) -> intdb.lrange(key: String, start: int, stop: int) -> List<Uint8List>db.lindex(key: String, index: int) -> Uint8List?db.lset(key: String, index: int, value: List<int>)db.ltrim(key: String, start: int, stop: int)Set Commands
Section titled âSet Commandsâdb.sadd(key: String, members: List<Uint8List>) -> intdb.srem(key: String, members: List<Uint8List>) -> intdb.smembers(key: String) -> List<Uint8List>db.sismember(key: String, member: List<int>) -> booldb.scard(key: String) -> intdb.sinter(keys: List<String>) -> List<Uint8List>db.sunion(keys: List<String>) -> List<Uint8List>db.sdiff(keys: List<String>) -> List<Uint8List>db.sscan(key: String, cursor: String, pattern: String?, count: int) -> (String, List<Uint8List>)Sorted Set Commands
Section titled âSorted Set Commandsâdb.zadd(key: String, members: List<ZMember>) -> intdb.zrem(key: String, members: List<Uint8List>) -> intdb.zscore(key: String, member: List<int>) -> double?db.zcard(key: String) -> intdb.zcount(key: String, minScore: double, maxScore: double) -> intdb.zincrby(key: String, increment: double, member: List<int>) -> doubledb.zrange(key: String, start: int, stop: int, withScores: bool) -> List<ZMember>db.zrevrange(key: String, start: int, stop: int, withScores: bool) -> List<ZMember>db.zrank(key: String, member: List<int>) -> int?db.zrevrank(key: String, member: List<int>) -> int?db.zscan(key: String, cursor: String, pattern: String?, count: int) -> (String, List<(Uint8List, double)>)Platform Support
Section titled âPlatform SupportâThe SDK supports all Flutter platforms via FFI:
- Android (arm64, arm32, x86_64, x86)
- iOS (arm64, simulator)
- macOS (arm64, x86_64)
- Linux (x86_64)
- Windows (x86_64)
Building from Source
Section titled âBuilding from Sourceâcd sdks/redlite-dart
# Install dependenciesmake setup
# Generate Rust-Dart bindingsmake codegen
# Build for current platformmake build
# Run testsmake testExample Flutter App
Section titled âExample Flutter Appâimport 'package:flutter/material.dart';import 'package:redlite/redlite.dart';import 'dart:convert';
void main() async { WidgetsFlutterBinding.ensureInitialized(); await RustLib.init(); runApp(MyApp());}
class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState();}
class _MyAppState extends State<MyApp> { late Db db; int counter = 0;
@override void initState() { super.initState(); db = Db.openMemory(); _loadCounter(); }
Future<void> _loadCounter() async { final value = await db.get_(key: 'counter'); if (value != null) { setState(() { counter = int.parse(utf8.decode(value)); }); } }
Future<void> _incrementCounter() async { final newValue = await db.incr(key: 'counter'); setState(() { counter = newValue; }); }
@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Redlite Counter')), body: Center( child: Text('Counter: $counter', style: TextStyle(fontSize: 24)), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, child: Icon(Icons.add), ), ), ); }}- All values are stored as bytes (
Uint8List). Useutf8.encode()andutf8.decode()for strings. - The SDK uses flutter_rust_bridge v2.11.1 for seamless Rust integration.
- Database operations are async and thread-safe.