LateInitializationError 共享首选项
LateInitializationError SharedPreferences
我正在尝试制作共享首选项的单例,但出现未初始化失败
(LateError (LateInitializationError: 字段 'prefs' 尚未初始化。)).
我不知道哪里出了问题。我想它可能是 SharedPreferences.dart 的 late,或者它缺少定义初始化的地方?
Personaje_home.dart
class PersonajeHomePage extends StatefulWidget {
const PersonajeHomePage({Key? key}) : super(key: key);
@override
State<PersonajeHomePage> createState() => _PersonajeHomePageState();
}
class _PersonajeHomePageState extends State<PersonajeHomePage> {
@override
Widget build(BuildContext context) {
var estiloTexto = EstiloTextos();
final proPersonaje = Provider.of<PersonajeProvider>(context);
return Scaffold(
backgroundColor: Colors.grey.shade300,
body: SafeArea(
child: SingleChildScrollView(
child: Column(
children: [
Text(proPersonaje.leerLvLPersonaje.toString()),
],
),
),
),
);
}
}
SharedPreferences.dart
class SharedPrefsPersonaje {
static final SharedPrefsPersonaje _instancia = SharedPrefsPersonaje._internal();
factory SharedPrefsPersonaje() {
return _instancia;
}
SharedPrefsPersonaje._internal();
late SharedPreferences prefs;
initPrefs() async {
prefs = await SharedPreferences.getInstance();
}
int get readExpPersonaje {
return prefs.getInt("experiencia_personaje") ?? 0;
}
set saveExpPersonaje(int value) {
prefs.setInt("experiencia_personaje", value);
}
int get readLvLPersonaje {
return prefs.getInt("nivel_personaje") ?? 0;
}
set saveLvLPersonaje(int value) {
prefs.setInt("nivel_personaje", value);
}
void eliminar() {
prefs.clear();
}
}
main.dart
void main() {
inicializamosCargaDatos();
runApp(AppState());
}
class AppState extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
//Cargamos datos del JSON, servidor
ChangeNotifierProvider(
create: (_) => PersonajeProvider(),
lazy: false,
),
],
child: MyApp(),
);
}
}
class MyApp extends StatefulWidget {
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false,
title: "My APP",
initialRoute: "/",
getPages: [
GetPage(
name: "/",
page: () => const PersonajeHomePage(),
),
],
);
}
}
Future<void> inicializamosCargaDatos() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = SharedPrefsPersonaje();
await prefs.initPrefs();
}
Provider_personajes.dart
class PersonajeProvider with ChangeNotifier {
final prefs = SharedPrefsPersonaje();
int xpPersonaje = 0;
int lvlPersonaje = 0;
get leerXPPersonaje {
if (prefs.readExpPersonaje != 0) {
return xpPersonaje = prefs.readExpPersonaje;
}
return xpPersonaje;
}
set guardarXPPersonaje(int xp) {
xpPersonaje = xp + xpPersonaje;
prefs.saveExpPersonaje = xpPersonaje;
notifyListeners();
}
get leerLvLPersonaje {
if (prefs.readLvLPersonaje != 0) {
return lvlPersonaje = prefs.readLvLPersonaje;
}
return lvlPersonaje;
}
set guardarLvLPersonaje(int lvl) {
lvlPersonaje = lvl + lvlPersonaje;
prefs.saveLvLPersonaje = lvlPersonaje;
notifyListeners();
}
void borrarDatos() {
prefs.eliminar();
}
}
您需要执行与使用 firebase 时类似的操作:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await inicializamosCargaDeDatos();
runApp(const MyApp());
}
这样,您就可以确保在实例初始化之前您的应用程序中的任何内容都不会被执行。
我正在尝试制作共享首选项的单例,但出现未初始化失败
(LateError (LateInitializationError: 字段 'prefs' 尚未初始化。)).
我不知道哪里出了问题。我想它可能是 SharedPreferences.dart 的 late,或者它缺少定义初始化的地方?
Personaje_home.dart
class PersonajeHomePage extends StatefulWidget {
const PersonajeHomePage({Key? key}) : super(key: key);
@override
State<PersonajeHomePage> createState() => _PersonajeHomePageState();
}
class _PersonajeHomePageState extends State<PersonajeHomePage> {
@override
Widget build(BuildContext context) {
var estiloTexto = EstiloTextos();
final proPersonaje = Provider.of<PersonajeProvider>(context);
return Scaffold(
backgroundColor: Colors.grey.shade300,
body: SafeArea(
child: SingleChildScrollView(
child: Column(
children: [
Text(proPersonaje.leerLvLPersonaje.toString()),
],
),
),
),
);
}
}
SharedPreferences.dart
class SharedPrefsPersonaje {
static final SharedPrefsPersonaje _instancia = SharedPrefsPersonaje._internal();
factory SharedPrefsPersonaje() {
return _instancia;
}
SharedPrefsPersonaje._internal();
late SharedPreferences prefs;
initPrefs() async {
prefs = await SharedPreferences.getInstance();
}
int get readExpPersonaje {
return prefs.getInt("experiencia_personaje") ?? 0;
}
set saveExpPersonaje(int value) {
prefs.setInt("experiencia_personaje", value);
}
int get readLvLPersonaje {
return prefs.getInt("nivel_personaje") ?? 0;
}
set saveLvLPersonaje(int value) {
prefs.setInt("nivel_personaje", value);
}
void eliminar() {
prefs.clear();
}
}
main.dart
void main() {
inicializamosCargaDatos();
runApp(AppState());
}
class AppState extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
//Cargamos datos del JSON, servidor
ChangeNotifierProvider(
create: (_) => PersonajeProvider(),
lazy: false,
),
],
child: MyApp(),
);
}
}
class MyApp extends StatefulWidget {
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false,
title: "My APP",
initialRoute: "/",
getPages: [
GetPage(
name: "/",
page: () => const PersonajeHomePage(),
),
],
);
}
}
Future<void> inicializamosCargaDatos() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = SharedPrefsPersonaje();
await prefs.initPrefs();
}
Provider_personajes.dart
class PersonajeProvider with ChangeNotifier {
final prefs = SharedPrefsPersonaje();
int xpPersonaje = 0;
int lvlPersonaje = 0;
get leerXPPersonaje {
if (prefs.readExpPersonaje != 0) {
return xpPersonaje = prefs.readExpPersonaje;
}
return xpPersonaje;
}
set guardarXPPersonaje(int xp) {
xpPersonaje = xp + xpPersonaje;
prefs.saveExpPersonaje = xpPersonaje;
notifyListeners();
}
get leerLvLPersonaje {
if (prefs.readLvLPersonaje != 0) {
return lvlPersonaje = prefs.readLvLPersonaje;
}
return lvlPersonaje;
}
set guardarLvLPersonaje(int lvl) {
lvlPersonaje = lvl + lvlPersonaje;
prefs.saveLvLPersonaje = lvlPersonaje;
notifyListeners();
}
void borrarDatos() {
prefs.eliminar();
}
}
您需要执行与使用 firebase 时类似的操作:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await inicializamosCargaDeDatos();
runApp(const MyApp());
}
这样,您就可以确保在实例初始化之前您的应用程序中的任何内容都不会被执行。