рд▓рдЧрднрдЧ рдПрдХ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рдлрд╝реНрд▓рдЯрд░ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдлреЛрди рдкрд░ рдЫреЛрдЯреЗ (рджрд╕рд┐рдпреЛрдВ рд╣рдЬрд╛рд░реЛрдВ) рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмреНрд░реЗрдХ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдереАред
рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдлреЛрди рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░, рдЖрдЧреЗ, рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рдиред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ (рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдиреЛрдЯреНрд╕, рдЖрджрд┐) рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдХрд░рдирд╛ред
рдпрд╣ рддрдм рд╢рд╛рдВрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рдХреЗрд╡рд▓ рдХреБрдЫ рд╣рдЬрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА, рдЬрдм рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХреИрд╢ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдЬрдм рдХреИрд╢ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рддреЛ рдзреАрдорд╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЙрдкрд╛рдп рд╣реИ! рд╣рд╛рдЗрд╡ - noSql рдЖрдзрд╛рд░ рд╢реБрджреНрдз рдбрд╛рд░реНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд╛рдЗрд╡ рдХреЗ рдлрд╛рдпрджреЗ:
- рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо - рдЪреВрдВрдХрд┐ рд╢реБрджреНрдз рдбрд╛рд░реНрдЯ рдкрд░ рдХреЛрдИ рдореВрд▓ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИрдВ - рдореЛрдмрд╛рдЗрд▓, рдбреЗрд╕реНрдХрдЯреЙрдк, рдмреНрд░рд╛рдЙрдЬрд╝рд░ред
- рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рдиред
- рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдордЬрдмреВрдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиред
рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рд╛рдЗрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕рд░рд▓ рдЯреВрдбреВ рдЖрд╡реЗрджрди рдХрд░реЗрдВ, рдЬреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдХреНрд▓рд╛рдЙрдб рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рд╣реЛрдЧрд╛ред

рд╢реБрд░реВ
рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрд╡реЗрджрди рдХреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдХреЛрдб рдЬреАрдердм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рд╣рд╛рдЗрд╡ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ https://docs.hivedb.dev/ - рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИред рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдмрд╕ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рд╣реИред
рддреЛ, рд╣рд╛рдЗрд╡ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, pubspec.yaml рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
dependencies:
hive: ^1.4.1+1
hive_flutter: ^0.3.0+2
dev_dependencies:
hive_generator: ^0.7.0+2
build_runner: ^1.8.1
рдЕрдЧрд▓рд╛, рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдЖрдорддреМрд░ рдкрд░ рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВред
await Hive.initFlutter();
, , . hive_flutter: ^0.3.0+2 тАФ Flutter.
, Hive List, Map, DateTime, BigInt Uint8List.
, TypeAdapters. https://docs.hivedb.dev/#/custom-objects/type_adapters ( hive_generator: ^0.7.0+2).
class Todo {
bool complete;
String id;
String note;
String task;
}
id тАФ typeId: 0
import 'package:hive/hive.dart';
part 'todo.g.dart';
@HiveType(typeId: 0)
class Todo {
@HiveField(0)
bool complete;
@HiveField(1)
String id;
@HiveField(2)
String note;
@HiveField(3)
String task;
}
, , . Hive.
flutter packages pub run build_runner build --delete-conflicting-outputs
todo.g.dart
\ Hive.
HiveObject тАФ Todo HiveObject
class Todo extends HiveObject {
2 save() delete(), .
тАФ Box
hive (box). , , ..
Box . , ( ).
var todoBox = await Hive.openBox<Todo>('box_for_todo');
read / write .
, :
,
var stringBox = await Hive.openBox<String>('name_of_the_box');
stringBox.put('key1', 'value1');
print(stringBox.get('key1')); // value1
stringBox.put('key2', 'value2');
print(stringBox.get('key2')); // value2
+
List. autoinrement.
: getAt(), putAt() and deleteAt()
add() .
stringBox.put('value1');
stringBox.put('value2');
stringBox.put('value3');
print(stringBox.getAt(1)); //value2
? , Hive. Listeners , . ( , ), Listeners . await .
,
var stringBox = await Hive.box<String>('name_of_the_box');
, singleton.
, , , ,
var stringBox = await Hive.openBox<String>('name_of_the_box');
, :
/// Returns a previously opened box.
Box<E> box<E>(String name);
/// Returns a previously opened lazy box.
LazyBox<E> lazyBox<E>(String name);
/// Checks if a specific box is currently open.
bool isBoxOpen(String name);
/// Closes all open boxes.
Future<void> close();
Devhack , Flutter тАФ open source, , , .
LazyBox тАФ
, . . , - .
, lazily
var lazyBox = await Hive.openLazyBox('myLazyBox');
var value = await lazyBox.get('lazyVal');
Hive . , Hive .
Hive AES-256 .
256-
var key = Hive.generateSecureKey();
Fortuna random number generator.
var encryptedBox = await Hive.openBox('vaultBox', encryptionKey: key);
encryptedBox.put('secret', 'Hive is cool');
print(encryptedBox.get('secret'));
:
- , plaintext.
- flutter_secure_storage .
- , , .
, , .
,
var box = Hive.box('myBox');
await box.compact();
await box.close();
todo_hive_example
, , , .
, .
:
:
1 тАФ
, , ( +.
, .
.
(, Dart (extensions)), /hive_flutter-0.3.0+2/lib/src/box_extensions.dart
/// Flutter extensions for boxes.
extension BoxX<T> on Box<T> {
/// Returns a [ValueListenable] which notifies its listeners when an entry
/// in the box changes.
///
/// If [keys] filter is provided, only changes to entries with the
/// specified keys notify the listeners.
ValueListenable<Box<T>> listenable({List<dynamic> keys}) =>
_BoxListenable(this, keys?.toSet());
}
, .
, ,
body: ValueListenableBuilder(
valueListenable: Hive.box<Todo>(HiveBoxes.todo).listenable(),
builder: (context, Box<Todo> box, _) {
if (box.values.isEmpty)
return Center(
child: Text("Todo list is empty"),
);
return ListView.builder(
itemCount: box.values.length,
itemBuilder: (context, index) {
Todo res = box.getAt(index);
return ListTile(
title: Text(res.task),
subtitle: Text(res.note),
);
},
);
},
),
. + .
, +.
Add , .
void _onFormSubmit() {
Box<Todo> contactsBox = Hive.box<Todo>(HiveBoxes.todo);
contactsBox.add(Todo(task: task, note: note));
Navigator.of(context).pop();
}
, , Todo. Hive.
github .
2 тАФ \
. , class Todo extends HiveObject
leading: res.complete
? Icon(Icons.check_box)
: Icon(Icons.check_box_outline_blank),
onTap: () {
res.complete = !res.complete;
res.save();
});
github .
3 тАФ тАФ
. dismissable .
background: Container(color: Colors.red),
key: Key(res.id),
onDismissed: (direction) {
res.delete();
},
, , .
github тАФ https://github.com/awaik/todo_hive_example
To be continued:
- BLoC. , , Apple Id.
- Firebase GraphQl . ( ).