首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LateInitializationError SharedPreferences

LateInitializationError SharedPreferences
EN

Stack Overflow用户
提问于 2022-02-10 13:10:31
回答 1查看 319关注 0票数 0

我试图使一个单一的共享偏好,但我得到一个失败的没有初始化。

(LateError (LateInitializationError: Field‘prefs“)尚未初始化.)

我不知道怎么回事。我认为它可能是针对SharedPreferences.dart,的晚期,还是缺少定义初始化的地方?

Personaje_home.dart

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
 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();
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 13:42:01

您需要做一些类似于使用firebase时所做的事情:

代码语言:javascript
复制
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await inicializamosCargaDeDatos();
  runApp(const MyApp());
}

这样,您就可以确保在初始化实例之前,应用程序中的任何内容都不会被执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71065727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档