shared_preferences_CastError
shared_preferences _CastError
提供的示例有效
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()
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的初始化应该放在哪里?
只需在主函数中添加WidgetsFlutterBinding.ensureInitialized();
:
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 使用本机平台代码来初始化存储。本次通信使用了Flutter平台通道,所以需要保证Flutter引擎绑定已经初始化。
您可以在 StatefulWidget 中使用 initState()
。因为它是启动 StatefullWidget 时的第一个函数 运行。
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
提供的示例有效
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()
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的初始化应该放在哪里?
只需在主函数中添加WidgetsFlutterBinding.ensureInitialized();
:
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 使用本机平台代码来初始化存储。本次通信使用了Flutter平台通道,所以需要保证Flutter引擎绑定已经初始化。
您可以在 StatefulWidget 中使用 initState()
。因为它是启动 StatefullWidget 时的第一个函数 运行。
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