Reputation: 11
im using riverpod so im managing state like this
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:to_do/tasks/tasks.dart';
import 'package:to_do/utils.dart';
final personalTaskProvider = ChangeNotifierProvider((ref) => PersonalTasks());
final academicTaskProvider = ChangeNotifierProvider((ref) => AcademicTasks());
class PersonalTasks extends ChangeNotifier {
PersonalTasks() {
loadTasks();
}
List<PersonalTask> personalTasks = [];
void loadTasks() {
Box box = Hive.box<PersonalTask>(personalTaskBoxString);
personalTasks = List<PersonalTask>.from(box.values);
notifyListeners();
}
Future<void> addTask(PersonalTask task) async {
Box box = Hive.box<PersonalTask>(personalTaskBoxString);
await box.add(task);
personalTasks.add(task);
notifyListeners();
}
Future<void> deleteTask(int index) async {
Box box = Hive.box<PersonalTask>(personalTaskBoxString);
await box.deleteAt(index);
personalTasks.removeAt(index);
notifyListeners();
}
}
class AcademicTasks extends ChangeNotifier {
AcademicTasks() {
loadTasks();
}
List<AcademicTask> academicTasks = [];
void loadTasks() {
Box box = Hive.box(academicTaskBoxString);
academicTasks = List<AcademicTask>.from(box.values);
notifyListeners();
}
Future<void> addTask(AcademicTask task) async {
Box box = Hive.box<AcademicTask>(academicTaskBoxString);
await box.add(task);
academicTasks.add(task);
notifyListeners();
}
Future<void> deleteTask(int index) async {
Box box = Hive.box<AcademicTask>(academicTaskBoxString);
await box.deleteAt(index);
academicTasks.removeAt(index);
notifyListeners();
}
}
This is the HomePage of my app
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:to_do/pages/homepage/bothepersonalandacademictask.dart';
import 'package:to_do/pages/homepage/homepageappbar.dart';
import 'package:to_do/pages/homepage/onlyacademictasks.dart';
import 'package:to_do/pages/homepage/onlypersonaltasks.dart';
import 'package:to_do/providers/taskprovider.dart';
import 'package:to_do/widgets/fab.dart';
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const HomePageAppBar(),
body: Consumer(
builder: (context, ref, child) => _scaffoldBody(ref),
),
floatingActionButton: const FAB(),
);
}
Widget _scaffoldBody(WidgetRef ref) {
final personalTasks = ref.watch(personalTaskProvider);
final academicTasks = ref.watch(academicTaskProvider);
if (personalTasks.personalTasks.isEmpty &&
academicTasks.academicTasks.isEmpty) {
return const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Good News :)",
style: TextStyle(fontSize: 40),
),
Text(
"No Pending Tasks",
style: TextStyle(fontSize: 40),
),
],
),
);
} else if (personalTasks.personalTasks.isEmpty) {
return OnlyAcademicTasks(academicTasks: academicTasks.academicTasks);
} else if (academicTasks.academicTasks.isEmpty) {
return OnlyPersonalTasks(personalTasks: personalTasks.personalTasks);
} else {
return BothPersonalAndAcademicTasks(
academicTasks: academicTasks.academicTasks,
personalTasks: personalTasks.personalTasks);
}
}
}
im getting Exception has occurred. HiveError (HiveError: The box "academictasks" is already open and of type Box.) this exception i dont know why by the way im new to hive i dont know how it works i dont know why im getting this error
i have tried removing constructors for provider classes i works but i the tasks arent storing i guess, i cant see my previous apps when i restart the app
im attaching the main.dart too
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive_flutter/adapters.dart';
import 'package:to_do/pages/homepage/homepage.dart';
import 'package:to_do/tasks/tasks.dart';
import 'package:to_do/utils.dart';
void main() async {
await Hive.initFlutter();
Hive.registerAdapter(AcademicTaskAdapter());
Hive.registerAdapter(PersonalTaskAdapter());
await Hive.openBox<PersonalTask>(personalTaskBoxString);
await Hive.openBox<AcademicTask>(academicTaskBoxString);
runApp(const ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark(useMaterial3: true),
debugShowCheckedModeBanner: false,
home: const HomePage(),
);
}
}
Upvotes: 1
Views: 15