bfs_manager 0.0.3
bfs_manager: ^0.0.3 copied to clipboard
A dynamic local SQLite database to server synchronization manager for Flutter applications.
Flutter bfs_manager SDK વપરાશ ગાઈડ (Step-by-Step Guide) #
આ દસ્તાવેજ bfs_manager પેકેજને ફ્લટર પ્રોજેક્ટમાં સરળતાથી સેટઅપ અને ઓટો-સિંક ઓપરેશન્સ કઈ રીતે વાપરવા તે સ્ટેપ-બાય-સ્ટેપ સમજાવે છે.
સ્ટેપ ૧: લાઇબ્રેરી ઇન્સ્ટોલ કરવી (Add Library from pub.dev) #
તમારા પ્રોજેક્ટની pubspec.yaml ફાઇલમાં dependencies સેક્શનમાં નીચે મુજબ લાઈબ્રેરી ઉમેરો:
dependencies:
flutter:
sdk: flutter
# Pub.dev પરથી ડાયરેક્ટ મેળવો
bfs_manager: ^0.0.3
ટર્મિનલમાં આ કમાન્ડ રન કરો:
flutter pub get
સ્ટેપ ૨: SDK પબ્લિક ફંક્શન્સ અને પેરામીટર્સની સમજૂતી (SDK Public Functions Reference) #
નીચે યુઝર દ્વારા ઉપયોગમાં લેવાતા તમામ પબ્લિક ફંક્શન્સ અને તેના પેરામીટર્સની વિગતવાર માહિતી આપેલ છે.
૧. BfsManager.instance.init() #
await BfsManager.instance.init(
baseUrl: "https://your-domain.com/api",
appDatabase: appDb.database,
);
- કામ (Purpose): SDK અને કનેક્શન સેટઅપને શરૂ કરવા માટે.
- પેરામીટર્સ (Parameters):
baseUrl: સર્વર એપીઆઈ નો બેઝ પાથ.appDatabase: તમારી મુખ્ય એપનો sqflite ડેટાબેઝ ઓબ્જેક્ટ (Databaseinstance).
- આંતરિક કાર્ય (Under the hood):
ApiServiceને સેટઅપ કરે છે અને સિંક માટે ડેટાબેઝ રેફરન્સ હોલ્ડ કરે છે.
૨. BfsManager.instance.apiRegister() #
await BfsManager.instance.apiRegister(
registerData,
extraHeaders: {"X-Device-Id": "123"},
onStart: () => print("શરૂ..."),
onSuccess: (response) => print("સફળ!"),
onFail: (error) => print("ભૂલ: $error"),
);
- કામ (Purpose): નવું યુઝર એકાઉન્ટ રજીસ્ટર કરવા માટે.
- પેરામીટર્સ (Parameters):
mData: રજીસ્ટ્રેશન વિગતોનો મેપ (Map<String, dynamic>).extraHeaders(ઓપ્શનલ): હેડરમાં મોકલવાના વધારાના કસ્ટમ પેરામીટર્સ.onStart/onSuccess/onFail: પ્રોસેસના અલગ-અલગ સ્ટેજ પર રન થતા કોલબેક ફંક્શન્સ.
- આંતરિક કાર્ય (Under the hood):
/registerપર રિકવેસ્ટ મોકલે છે. જો રિસ્પોન્સમાં'token'મળશે, તો તેને આંતરિક સ્ટોરેજમાં આપોઆપ સેવ કરી લેશે જેથી ભવિષ્યના સિંક કોલ્સમાં તેBearer Tokenતરીકે આપમેળે મોકલી શકાય.
૩. BfsManager.instance.apiLogin() #
await BfsManager.instance.apiLogin(
loginData,
extraHeaders: {"X-App-Platform": "Android"},
onStart: () => print("શરૂ..."),
onSuccess: (response) => print("સફળ!"),
onFail: (error) => print("ભૂલ: $error"),
);
- કામ (Purpose): યુઝર લોગિન પ્રોસેસ કરવા માટે.
- પેરામીટર્સ (Parameters):
mData: ઇમેઇલ અને પાસવર્ડ ડેટા મેપ.extraHeaders(ઓપ્શનલ): હેડરમાં મોકલવાના વધારાના કસ્ટમ પેરામીટર્સ.onStart/onSuccess/onFail: સ્ટેટસ કોલબેક ફંક્શન્સ.
- આંતરિક કાર્ય (Under the hood):
/loginપર રિકવેસ્ટ મોકલે છે. લોગિન સફળ થતાં મળેલા ઓથેન્ટિકેશન ટોકનને SDK આંતરિક સ્ટોરેજમાં સેવ કરી લે છે.
૪. BfsManager.instance.insertLocal() #
await BfsManager.instance.insertLocal(
tableName: "tb_tasks",
status: "insert",
data: myTask.toJson(),
);
- કામ (Purpose): લોકલ ફેરફારને સિંક કતાર (Offline Queue) માં સાચવવા માટે.
- પેરામીટર્સ (Parameters):
tableName: ડેટાબેઝ ટેબલનું નામ.status: ઓપરેશનનો પ્રકાર (insert,update, અથવાdelete).data: તે લાઈનનો આખો ડેટા મેપ ફોર્મેટમાં (Map<String, dynamic>).
- આંતરિક કાર્ય (Under the hood): આ ડેટાને SDK ના આંતરિક ડેટાબેઝ (
bfs_sync_internal.db) માં ટાસ્ક તરીકે સેવ કરે છે, and તે જ સમયે બેકગ્રાઉન્ડમાંpushChanges()રન કરે છે જેથી ડેટા ઓટોમેટિકલી સર્વર પર અપલોડ થઈ જાય.
૫. BfsManager.instance.pullAll() #
await BfsManager.instance.pullAll(
['tb_tasks', 'tb_categories'],
onStart: () => print("શરૂ..."),
onComplete: () => print("સંપૂર્ણ સિંક થયું!"),
onError: (error) => print("ભૂલ: $error"),
);
- કામ (Purpose): સર્વર પરથી બધો જ ડેટા પ્રથમ વખત પેજીનેશન સાથે ડાઉનલોડ કરવા માટે.
- પેરામીટર્સ (Parameters):
tableNameList: સિંક કરવાના ટેબલ નામોની લિસ્ટ.onStart/onComplete/onError: સિંક સ્ટેટસ જાણવા માટેના કોલબેક્સ.
- આંતરિક કાર્ય (Under the hood):
/sync/pull-allપર રિકવેસ્ટ કરીને લિમિટ પ્રમાણે ડેટા લાવે છે, અને જ્યાં સુધીhas_more: trueહોય ત્યાં સુધી આગળના પેજના ડેટાને લાવીને મેઈન ડેટાબેઝમાંdynamicInsertOrReplaceદ્વારા સેવ કરે છે.
૬. BfsManager.instance.pullUpdates() #
await BfsManager.instance.pullUpdates();
- કામ (Purpose): છેલ્લે સિંક કર્યા પછીથી અત્યાર સુધીમાં સર્વર પર થયેલા નવા ફેરફારો અને ડિલીટ થયેલા રેકોર્ડ્સ લોકલી અપડેટ કરવા માટે (Incremental Pull).
- પેરામીટર્સ (Parameters): કોઈ પેરામીટરની જરૂર નથી.
- આંતરિક કાર્ય (Under the hood): છેલ્લો સિંક ટાઈમ સર્વર પર મોકલીને નવા બદલાયેલા ડેટાને
INSERT OR REPLACEકરે છે, અને ડિલીટ થયેલા ડેટાને UUID ના આધારે મેઈન ડેટાબેઝમાંથી કાઢી નાખે છે. છેલ્લે સર્વરનો સમય નવોlastSyncTimeતરીકે સ્ટોર કરે છે.
૭. BfsManager.instance.pushChanges() #
await BfsManager.instance.pushChanges();
- કામ (Purpose): કતાર (Queue) માં પડેલા તમામ ઓફલાઇન લોકલ સુધારાને મેન્યુઅલી સર્વર પર પુશ કરવા માટે.
- પેરામીટર્સ (Parameters): કોઈ પેરામીટરની જરૂર નથી.
- આંતરિક કાર્ય (Under the hood): આંતરિક સ્ટોરેજમાંથી પેન્ડિંગ ટાસ્ક્સ ભેગા કરીને
/sync/pushએપીઆઈ પર મોકલે છે. સફળતાપૂર્વક અપલોડ થતાં લોકલ સિંક કતાર ક્લિયર કરે છે.
સ્ટેપ ૩: મેઈન ફાઈલમાં સિંક મેનેજર ઇનિશિયલાઇઝ કરવું (Initialization in main.dart) #
એપ્લિકેશન રન થાય ત્યારે main.dart ફાઈલમાં BfsManager ને ઇનિશિયલાઇઝ કરો. આ માટે તમારો મેઈન ડેટાબેઝ ઓબ્જેક્ટ (Database instance) અને બેઝ URL (baseUrl) મોકલવાના રહેશે.
import 'package:flutter/material.dart';
import 'package:bfs_manager/bfs_manager.dart';
import 'package:your_app/database/app_database.dart'; // તમારો ડેટાબેઝ ક્લાસ
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// ૧. લોકલ ડેટાબેઝના સિંગલટન ઈન્સ્ટન્સ દ્વારા ડેટાબેઝ ઓપન કરો
final appDb = await AppDatabase.getInstance();
// ૨. સિંક મેનેજર ઇનિશિયલાઇઝ કરો
await BfsManager.instance.init(
baseUrl: "https://your-domain.com/api",
appDatabase: appDb.database, // Floor નો sqflite Database ઓબ્જેક્ટ આપો
);
runApp(const MyApp());
}
સ્ટેપ ૪: યુઝર રજીસ્ટ્રેશન એપીઆઈ (Register API Call) #
યુઝર રજીસ્ટ્રેશન માટે apiRegister નો ઉપયોગ કરો. ઓથેન્ટિકેશન સફળ થતા SDK આંતરિક રીતે Bearer Token સેવ કરી લેશે. જો એક્સ્ટ્રા હેડર પેરામીટર્સ મોકલવા હોય તો extraHeaders નો ઉપયોગ કરો.
// રજીસ્ટ્રેશન માટેનો પેલોડ (Dummy Data)
Map<String, dynamic> registerData = {
"name": "Vijay Katariya",
"email": "vijay@example.com",
"password": "securepassword123",
"password_confirmation": "securepassword123",
"device_name": "iPhone 14 Pro"
};
// રજીસ્ટ્રેશન એપીઆઈ કોલ
await BfsManager.instance.apiRegister(
registerData,
extraHeaders: {
"X-App-Platform": "iOS",
"X-Device-Id": "device-uuid-12345"
},
onStart: () {
print("રજીસ્ટ્રેશન શરૂ થઈ રહ્યું છે...");
},
onSuccess: (response) {
print("રજીસ્ટ્રેશન સફળ! સર્વર પ્રતિસાદ: $response");
},
onFail: (error) {
print("રજીસ્ટ્રેશન અસફળ: $error");
},
);
સ્ટેપ ૫: યુઝર લોગિન એપીઆઈ (Login API Call) #
યુઝર લોગિન માટે apiLogin નો ઉપયોગ કરો. સફળતાપૂર્વક લોગિન થયા બાદ, ડેટા પ્રથમવાર ડાઉનલોડ કરવા માટે pullAll કોલ કરી શકાય છે.
// લોગિન માટેનો પેલોડ (Dummy Data)
Map<String, dynamic> loginData = {
"email": "vijay@example.com",
"password": "securepassword123",
"device_name": "iPhone 14 Pro"
};
// લોગિન એપીઆઈ કોલ
await BfsManager.instance.apiLogin(
loginData,
extraHeaders: {
"X-App-Platform": "iOS"
},
onStart: () {
print("લોગિન શરૂ થઈ રહ્યું છે...");
},
onSuccess: (response) async {
print("લોગિન સફળ! સર્વર પ્રતિસાદ: $response");
// લોગિન પછી તરત જ ડેટા પ્રથમ વાર ડાઉનલોડ કરવા માટે pullAll કોલ કરો
await BfsManager.instance.pullAll(
['tb_tasks'],
onStart: () => print("સિંક્રોનાઇઝેશન શરૂ..."),
onComplete: () => print("સિંક પૂરું થયું!"),
onError: (err) => print("સિંક એરર: $err"),
);
},
onFail: (error) {
print("લોગિન અસફળ: $error");
},
);
સ્ટેપ ૬: લોકલ ડેટાબેઝ સિંગલટન સેટઅપ અને CRUD ઓપરેશન્સ (Local DB Singleton & Sync Setup) #
તમારા પ્રોજેક્ટમાં Floor લાઇબ્રેરી વાપરીને સિંગલટન ડેટાબેઝ અને ટેબલ કેવી રીતે બનાવવા તેમજ લોકલ CRUD સાથે SDK કઈ રીતે મેનેજ કરવું તેનું ઉદાહરણ નીચે મુજબ છે.
એ. ટેબલ (Entity) ની વ્યાખ્યા #
દરેક સિંક થતા ટેબલમાં uuid prાઈમરી કી તરીકે હોવું અનિવાર્ય છે.
import 'package:floor/floor.dart';
@Entity(tableName: 'tb_tasks')
class Task {
@primaryKey
final String uuid;
final String title;
final String status;
Task({required this.uuid, required this.title, required this.status});
Map<String, dynamic> toJson() {
return {
'uuid': uuid,
'title': title,
'status': status,
};
}
}
બી. ડેટાબેઝ અને DAO (Singleton Pattern) #
સિંગલટન ડિઝાઇન પેટર્ન વાપરીને ડેટાબેઝ બનાવવાની રીત:
// DAO વ્યાખ્યા
@dao
abstract class TaskDao {
@Query('SELECT * FROM tb_tasks')
Future<List<Task>> getAllTasks();
@insert
Future<void> insertTask(Task task);
@update
Future<void> updateTask(Task task);
@Query('DELETE FROM tb_tasks WHERE uuid = :uuid')
Future<void> deleteTaskByUuid(String uuid);
}
// સિંગલટન ડેટાબેઝ કનેક્શન ક્લાસ
@Database(version: 1, entities: [Task])
abstract class AppDatabase extends FloorDatabase {
TaskDao get taskDao;
static AppDatabase? _instance;
static Future<AppDatabase> getInstance() async {
if (_instance != null) {
return _instance!;
}
_instance = await $FloorAppDatabase.databaseBuilder('app_database.db').build();
return _instance!;
}
}
સી. લોકલ ડેટાબેઝમાં CRUD ઓપરેશન્સ કરવા અને સિંક માટે રજીસ્ટર કરવું (Insert/Update/Delete) #
જ્યારે પણ તમે લોકલ ડેટાબેઝમાં ડેટા બદલો, ત્યારે SDK ને તે ઓપરેશનની માહિતી આપો જેથી તે આપમેળે બેકએન્ડ પર સિંક કરી શકે.
૧. નવો ડેટા ઉમેરવો (Insert)
final task = Task(uuid: "some-unique-uuid-1", title: "નવો ટાસ્ક", status: "pending");
// લોકલ ડેટાબેઝમાં એડ કરો
await appDb.taskDao.insertTask(task);
// SDK ને લોકલ કતાર (queue) માં મોકલો
await BfsManager.instance.insertLocal(
tableName: "tb_tasks",
status: "insert",
data: task.toJson(),
);
૨. ડેટા સુધારવો (Update)
final updatedTask = Task(uuid: "some-unique-uuid-1", title: "ટાસ્ક બદલાયો", status: "completed");
// લોકલ ડેટાબેઝમાં અપડેટ કરો
await appDb.taskDao.updateTask(updatedTask);
// SDK માં અપડેટ લોગ કરો
await BfsManager.instance.insertLocal(
tableName: "tb_tasks",
status: "update",
data: updatedTask.toJson(),
);
૩. ડેટા કાઢી નાખવો (Delete)
final uuidToDelete = "some-unique-uuid-1";
// લોકલ ડેટાબેઝમાંથી કાઢી નાખો
await appDb.taskDao.deleteTaskByUuid(uuidToDelete);
// SDK માં ડિલીટ ઓપરેશન સેટ કરો
await BfsManager.instance.insertLocal(
tableName: "tb_tasks",
status: "delete",
data: {"uuid": uuidToDelete},
);