1

Isar does not persist state, every time I close my mobile application and open it again, previous values are not there, when they should be there. I'm fetching those values from Isar. Please show with a counter app example how this works.

I'm attaching files.

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isarapp/counter_schema.dart';
import 'package:isar/isar.dart';
import 'package:isarapp/home_screen.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  var directory = await getApplicationDocumentsDirectory();
  var path = directory.path;

  await Isar.open(
    [CounterObjectSchema],
    directory: path,
    inspector: true,
    name: "isardb",
  );

  runApp(const MyApp());
}

class MyApp extends ConsumerWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return ProviderScope(
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: const HomeScreen(),
      ),
    );
  }
}


I have edited android manifest file to get store permission then using permission_handler for getting storage access.

home_screen.dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:isarapp/counter_schema.dart';
import 'package:permission_handler/permission_handler.dart';

final counterProvider1 = StateProvider<int>((ref) {
  return 0;
});

class HomeScreen extends ConsumerStatefulWidget {
  const HomeScreen({super.key});

  @override
  ConsumerState<ConsumerStatefulWidget> createState() => _HomeScreenState();
}

getStoragePermission() async {
  var status = await Permission.storage.status;
  if (status.isDenied) {
    Permission.storage.request();
  }
}

class _HomeScreenState extends ConsumerState<HomeScreen> {
  Isar? isar = Isar.getInstance("isardb");
  CounterObject counterObject = CounterObject(counter: 9);

  initCounter() async {
    var count = await isar?.collection<CounterObject>().get(counterObject.id);

    //reset counter on launch
    ref.read(counterProvider1.notifier).state = count?.counter ?? -1;
  }

  increment() async {
    counterObject.counter = counterObject.counter + 1;
   
    //update state
    ref.read(counterProvider1.notifier).state = counterObject.counter;

    //writing counterValue to isardb on every increment call
    isar?.writeTxn(
      () async => await isar?.collection<CounterObject>().put(counterObject),
    );

  }//increment

  @override
  void initState() {
    getStoragePermission();

//putting counterObject in 
    isar?.writeTxn(
      () async => await isar?.counterObjects.put(counterObject),
    );
    initCounter();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            children: [
              Text(
                ref.watch(counterProvider1).toString(),
                style: const TextStyle(fontSize: 54),
              ),
              GestureDetector(
                onTap: () => increment(),
                child: Container(
                  width: 200,
                  height: 40,
                  color: Colors.blue[300],
                  child: const Center(child: Text("Add")),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

CounterObjectSchema

import 'package:isar/isar.dart';
part 'counter_schema.g.dart';

@collection
class CounterObject {
  Id id = Isar.autoIncrement;
  int counter;

  CounterObject({required this.counter});
}

0 Answers0