应用程序启动时如何从HIVE "load"数据?



我正在尝试添加几个朋友的名字到一个框,然后"unbox"每次应用在ListView.builder中启动时。其他一切都在代码中工作,我试图复制粘贴一大块有用的代码,如果其他地方看起来有问题,那么很可能是因为我粘贴错了。我对这事很陌生。

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:async/async.dart

void main()  {
runApp(MyApp());
}
class MyApp extends StatelessWidget  {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Friends',
home: myFriends(),
);}}

class myFriends extends StatefulWidget {
@override
_myFriends createState() => _myFriendsState();
}
class _myFriends extends State<myFriends> {
@override
Widget build(BuildContext context) {
void initState() async{
await Hive.initFlutter();
await Hive.openBox("FRIENDS");
}
Hive.openBox("FRIENDS");
var box = Hive.box('FRIENDS');
List New_List= box.get('Close_Friends');
print(New_List);

return MaterialApp(title: "Friends",
home: Scaffold(
extendBody: true,
resizeToAvoidBottomInset: true,
body: SafeArea(bottom: false,
child:Column(Children[
RaisdButton(onPressed: openAddBox(),)
ListView.builder(
controller: _scrollController,
itemCount: New_List.length,
itemBuilder: (context, index) {
return Container(child:
Text(New_List[index],)
)})]))));




openAddBox() async {
TextEditingController Add_Controller = TextEditingController();
var ActualW = MediaQuery.of(context).size.width;
return showDialog(
context: context,
builder: (BuildContext context) {
return SingleChildScrollView(child: AlertDialog(
content: Container(
width: ActualW * 0.95,
child: Column(
children: <Widget>[
Container(height: 45, alignment: Alignment.center,                
child: Text(
"Add a friend",
style: TextStyle(fontSize: 18.0,
fontWeight: FontWeight.bold,
color: Colors.white),
textAlign: TextAlign.center,
),
),
Padding(
padding: EdgeInsets.only(left: 30.0, right: 30.0),
child: TextField(
controller: Add_Controller,
autofocus: true,
autocorrect: false,
textCapitalization: TextCapitalization.characters,
decoration: InputDecoration(
hintText: "Peter ... ",
),
maxLines: 1,
),
),
SizedBox(height: 20,),

Padding(
padding: EdgeInsets.only(left: 50.0, right: 50.0), child:
Container(alignment: Alignment.center,
width: 150,
height: 30,

child:   InkWell(onTap: (){                         
String new_friend = Add_Controller.text;
var box = Hive.box('FRIENDS');
box.put("Close_Friends", new_friend);}



我不确定您在哪里需要数据,所以我猜每当某个值发生变化时您就需要它。下面是一个示例,因此在更新某个框时如何更新值是有意义的。并建议不要将asyncinitState同时使用。

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
const darkModeBox = 'darkModeTutorial';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
await Hive.openBox(darkModeBox);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: Hive.box(darkModeBox).listenable(),
builder: (context, box, widget) {
var darkMode = box.get('darkMode', defaultValue: false);
return MaterialApp(
themeMode: darkMode ? ThemeMode.dark : ThemeMode.light,
darkTheme: ThemeData.dark(),
home: Scaffold(
body: Center(
child: Switch(
value: darkMode,
onChanged: (val) {
box.put('darkMode', !darkMode);
},
),
),
),
);
},
);
}
}

来源

最新更新