您好,我使用共享的首选项和下拉菜单将屏幕值保存在应用程序中,但是在添加共享的首选项代码后,它显示以下错误,但是如果删除共享的首选项代码,则下拉列表可以正常工作。没有共同的想法,下拉列表就可以正常工作。但是在我添加共享偏好代码以保存我的下拉值之后,就会出现此错误。This is error show in my app
这是我的完整代码
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class HomeView extends StatelessWidget {
const HomeView({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(body: DropPage());
}
}
class DropPage extends StatefulWidget {
@override
_DropPageState createState() => _DropPageState();
}
class _DropPageState extends State<DropPage> {
String _selectedGender = 'FYJC';
SharedPreferences prefs;
final _key = 'cur_r';
@override
void initState() {
super.initState();
_read(); // read in initState
}
_read() async {
prefs = await SharedPreferences.getInstance();
setState(() {
_selectedGender = prefs.getString(_key) ?? "FYJC"; // get the value
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Screen'),
),
body: Center(
child: Column(
children: <Widget>[
DropdownButton(
value: _selectedGender,
items: _dropDownItem(),
onChanged: (value) {
setState(() {
_selectedGender = value;
});
prefs.setString(
_key, _selectedGender); // save value to SharedPreference
_selectedGender = value;
switch (value) {
case "FYJC":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "SYJC":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "FYBCOM":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "SYBCOM":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "TYBCOM":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
}
},
hint: Text('Select Cource Year'),
),
],
),
),
);
}
List<DropdownMenuItem<String>> _dropDownItem() {
List<String> ddl = [
"FYJC",
"SYJC",
"FYBCOM",
"SYBCOM",
"TYBCOM",
];
return ddl
.map((value) => DropdownMenuItem(
value: value,
child: Text(value),
))
.toList();
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Screen"),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Go back!'),
),
),
);
}
}
我无法使用给定的代码重现错误。您能否更具体地说明何时发生错误?
也许这会帮助link
_read() async {
prefs = await SharedPreferences.getInstance();
setState(() {
final cachedValue = prefs.getString(_key);
if(cachedValue != null)
_navigate(cachedValue);
_selectedGender = cachedValue ?? "FYJC"; // get the value
});
}
...
void _navigate(value) {
switch (value) {
case "FYJC":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "SYJC":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "FYBCOM":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "SYBCOM":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
case "TYBCOM":
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
break;
}
}
这种方法存在问题。
我认为最好使用这样的东西:
home: expression ? DropPage() : SelectedPage(),