问题描述
我是 Flutter 的新手,我使用 Hive 作为我的数据库。我正在尝试使用 ValueListenableBuilder
小部件来收听新的数据库更新。但我收到以下错误。
The argument type 'Box<dynamic>' can't be assigned to the parameter type 'ValueListenable<dynamic>'.
不过,我在 list_session
Widget 上使用了相同的代码,但我没有遇到任何错误。但是,对于第二个小部件,我遇到了这个错误。我正在粘贴代码以供参考。
请在下面找到我的代码。
main.dart file
import 'package:Flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:time_tracker/models/sessions.dart';
import 'pages/home.dart';
import 'pages/create_session_form.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Inititalise Hive DB
final appDocumentDirectory = await path_provider.getApplicationDocumentsDirectory();
Hive.init(appDocumentDirectory.path);
Hive.registeradapter(SessionAdapter());
await Hive.openBox('tasks');
await Hive.openBox('tags');
Color themeColor = Colors.purple;
runApp(MaterialApp(
// home: Home(),initialRoute: '/',routes: {
'/': (context) => FutureBuilder(
future: Hive.openBox('sessions'),builder: (BuildContext context,AsyncSnapshot snapshot) {
if(snapshot.connectionState == ConnectionState.done) {
return Home();
} else {
return Scaffold();
}
}
),'/create_session': (context) => CreateSessionForm(themeColor: themeColor)
},));
}
create_session_form.dart file
import 'package:Flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:time_tracker/models/sessions.dart';
import 'package:time_tracker/models/tags.dart';
import 'package:time_tracker/models/tasks.dart';
import 'package:time_tracker/my_widgets/dropdown_widget.dart';
class CreateSessionForm extends StatefulWidget {
final Color themeColor;
final DateTime activeDate;
final Function changeDate;
CreateSessionForm ({Key key,this.themeColor,this.activeDate,this.changeDate}) : super(key: key);
@override
CreateSessionFormState createState() => CreateSessionFormState(themeColor: this.themeColor,activeDate: this.activeDate,changeDate: this.changeDate);
}
class CreateSessionFormState extends State<CreateSessionForm> {
final _formKey = GlobalKey<FormState>();
Color themeColor;
DateTime activeDate;
final Function changeDate;
CreateSessionFormState({this.themeColor,this.changeDate});
String taskName;
String tagName;
List<String> taskNames = [];
// List<String> tagNames = [];
String sessionDescription;
Map<String,Color> sessionTags = {};
DateTime startTime;
DateTime endTime;
bool isTaskAdded = false;
bool isTagAdded = false;
Color color;
TimeOfDay _startTime;
TimeOfDay _endTime;
Map<String,Color> colors = {
'Amber': Colors.Amber,'Blue': Colors.blue,'Black': Colors.black,'Orange': Colors.orange,'Pink': Colors.pink,'Red': Colors.red,'Yellow': Colors.yellow
};
void addSession(Session session) {
Hive.Box('sessions').add(session);
}
@override
Widget build(BuildContext context) {
// Hive.openBox('tasks');
// dynamic tasksBox = Hive.Box('tasks');
return Scaffold(
appBar: AppBar(
title: Text('Create Session'),backgroundColor: this.themeColor,),body: Padding(
padding: EdgeInsets.all(10.0),child: Form(
key: _formKey,child: Column(
children: <Widget>[
ValueListenableBuilder(
valueListenable: Hive.Box('tasks'),builder: (context,tasksBox,widget) {
return MyDropDownWidget(taskName,taskNames,changeTask);
},],)
);
}
}
list_sessions - This widget works perfectly without issues
import 'package:Flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_Flutter/hive_Flutter.dart';
import 'package:time_tracker/models/sessions.dart';
class ListSessions extends StatelessWidget {
ListSessions(this.activeDate);
final activeDate;
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: Hive.Box('sessions').listenable(),sessionsBox,widget) {
DateTime greaterDate = activeDate.add(const Duration(days: 1));
return ListView.builder(
itemCount: sessionsBox.length,itemBuilder: (context,index) {
final sessions = sessionsBox.getAt(index) as Session;
return Card(
child: Padding(
padding: EdgeInsets.fromLTRB(10.0,5,10.0,5),child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,children: <Widget>[
Text(
// 'Create Flutter App',sessions.taskName,style: TextStyle(
fontSize: 18.0,fontWeight: FontWeight.w600
),]
),SizedBox(height: 20.0),Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,children: sessions.sessionTags.entries.map((entry) {
// var w = Text(entry.value);
// doSomething(entry.key);
return Row(
children: [
Icon(Icons.circle,color: entry.value,size: 18.0),SizedBox(width: 5.0),Text(entry.key)
]
);
}).toList()),Column(
children: <Widget>[
IconButton(
icon: Icon(Icons.delete),onpressed: () {
// Hive.Box('sessions').deleteAt(index);
Hive.Box('sessions').deleteAt(index);
}
),SizedBox(height: 5.0),Text('Completed')
],)],]
)
),);
}
);
});
}
}
解决方法
只需像在 ListSession 小部件上那样在 .listenable()
之后添加 Hive.box('tasks')