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

shared_preferences _CastError
EN

Stack Overflow用户
提问于 2021-05-30 17:02:26
回答 2查看 131关注 0票数 1

提供的示例可以正常工作

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: Center(
      child: RaisedButton(
        onPressed: _incrementCounter,
        child: Text('Increment Counter'),
        ),
      ),
    ),
  ));
}

_incrementCounter() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int counter = (prefs.getInt('counter') ?? 0) + 1;
  print('Pressed $counter times.');
  await prefs.setInt('counter', counter);
}

,但是假设我想在runApp之前加载数据。只需像这样移动_incrementCounter()

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
 _incrementCounter(); 
  runApp(MaterialApp(
    home: Scaffold(
      body: Center(
      child: RaisedButton(
        onPressed: _incrementCounter,
        child: Text('Increment Counter'),
        ),
      ),
    ),
  ));
}

_incrementCounter() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int counter = (prefs.getInt('counter') ?? 0) + 1;
  print('Pressed $counter times.');
  await prefs.setInt('counter', counter);
}

但是现在我得到了一个"_CastError (用于空值的空值检查运算符)“。

如果在runApp之前有一个init()就好了,但是看起来至少shared_preferences在某种程度上依赖于runApp中发生的事情。

如果不是在runApp之前,那么使用shared_preferences初始化应该放在哪里?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-30 17:46:53

只需在main函数中添加WidgetsFlutterBinding.ensureInitialized();

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

Future<void> main() async {
 WidgetsFlutterBinding.ensureInitialized(); // Add this

 await _incrementCounter(); // Also, add await here since the function is async

  runApp(MaterialApp(
    home: Scaffold(
      body: Center(
      child: RaisedButton(
        onPressed: _incrementCounter,
        child: Text('Increment Counter'),
        ),
      ),
    ),
  ));
}

Future<void> _incrementCounter() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int counter = (prefs.getInt('counter') ?? 0) + 1;
  print('Pressed $counter times.');
  await prefs.setInt('counter', counter);
}

问题是,SharedPreferences使用本机平台代码来初始化存储。颤动平台通道用于此通信,因此您需要确保已初始化颤动引擎绑定。

票数 4
EN

Stack Overflow用户

发布于 2021-05-30 17:54:47

您可以在StatefulWidget中使用initState()。因为它是启动StatefullWidget时运行的第一个函数。

代码语言:javascript
复制
import 'package:flutter/material.dart';
class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    // Get shared_preferences in here
    print('Async done');
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    print('object');
    print('object2');
    print('object3');
    return MaterialApp(
        home: Scaffold(
      body: Center(
        child: RaisedButton(),
      ),
    ));
  }
}

您可以访问该网站了解StatefullWidget https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html的生命周期

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

https://stackoverflow.com/questions/67759466

复制
相关文章

相似问题

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