我已经建立了一个安卓应用程序,我想当我再次打开应用程序,它来的最后一个值和状态,我以前做的。这个错误是我运行应用程序后来的。有人可以请提供一个什么样的示例代码需要解决下面的错误?
出现异常。最近错误(最近初始化错误:字段"prefs"尚未初始化。)
这是我的代码:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
var dataAddress;
final _usernameController = TextEditingController();
final _passwordController = TextEditingController();
bool isPressed = true;
var state = FlutterVpnState.disconnected;
CharonErrorState? charonState = CharonErrorState.NO_ERROR;
late SharedPreferences prefs;
@override
void initState() {
super.initState();
initSharedPreferences();
FlutterVpn.prepare();
FlutterVpn.onStateChanged.listen((s) => setState(() => state = s));
SharedPreferences.getInstance().then((value) => prefs = value);
}
void initSharedPreferences() async {
prefs = await SharedPreferences.getInstance();
String? address = prefs.getString('address');
String? username = prefs.getString('username');
String? password = prefs.getString('password');
dataAddress = address ?? '';
_usernameController.text = username ?? '';
_passwordController.text = password ?? '';
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SafeArea(
child: Scaffold(
body: Stack(
fit: StackFit.expand,
children: <Widget>[
ListView(
children: <Widget>[
StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('servers').snapshots(includeMetadataChanges: true),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return Text('Something went wrong');
}
return DropdownSearch<String>(
dropdownDecoratorProps: DropDownDecoratorProps(
dropdownSearchDecoration: InputDecoration(
labelText: "Server",
),
),
dropdownBuilder: ((context, selectedItem) {
return Text(
selectedItem ?? ""
);
}),
items: snapshot.data!.docs.map((DocumentSnapshot document) {
Map<String, dynamic> data = document.data()! as Map<String, dynamic>;
return data["address"];
})
.toList().cast<String>(),
onChanged: (data) {
setState(() {
dataAddress = data;
});
},
selectedItem: dataAddress,
);
},
),
TextFormField(
controller: _usernameController,
decoration: InputDecoration(
labelText: 'Username',
),
),
TextFormField(
controller: _passwordController,
decoration: InputDecoration(
labelText: 'Password'
),
),
IconButton(
onPressed: () async {
if (state == FlutterVpnState.disconnected) {
setState(() {
isPressed = true;
});
try {
await FlutterVpn.connectIkev2EAP(
server: dataAddress,
username: _usernameController.text,
password: _passwordController.text,
);
setState(() {
isPressed = false;
});
} catch (e) {
setState(() {
isPressed = false;
});
}
} else {
FlutterVpn.disconnect();
setState(() {
isPressed = true;
});
}
},
icon: state == FlutterVpnState.connecting || state == FlutterVpnState.disconnecting
? LoadingAnimationWidget.inkDrop(
color: Colors.white,
size: 100
)
: state == FlutterVpnState.disconnected
? Image.asset('assets/images/power-on.png')
: Image.asset('assets/images/power-off.png')
),
),
],
),
],
),
),
),
);
}
}
编辑:我尝试了上面的两个解决方案,但在我关闭后,我再次打开应用程序,它没有来到最后的值和状态。
2条答案
按热度按时间nhn9ugyo1#
由于您仅在函数
initSharedPreferences
中使用prefs
,因此将其设置为局部变量删除以下两行。
希望这能帮上忙。
tez616oj2#
SharedPreferences.getInstance().then((value) => prefs = value);
中使用async
函数initSharedPreferences()
之前,它不是awaited
1.从
initState()
中删除SharedPreferences.getInstance().then((value) => prefs = value);
,因为您不能等待initSharedPreferences()
函数,因为它是initState()
。并将其放入initSharedPreferences()
函数中。1.您甚至可以在
initSharedPreferences()
函数中局部使用prefs
变量,并避免在函数外部定义它。