我很难使用首选项库RadioPreference
来检索Flutter项目中多个https://pub.dev/packages/preferences#中的用户首选项。我知道如何在Flutter中使用SharedPreferences
,但是按照首选项页面中的示例进行操作之后,我似乎无法检索到实际的用户选择。
例如
PreferenceDialogLink(
'Android\'s "ListPreference"',
dialog: PreferenceDialog(
[
RadioPreference(
'Select me!', 'select_1', 'android_listpref_selected'),
RadioPreference(
'Hello World!', 'select_2', 'android_listpref_selected'),
RadioPreference('Test', 'select_3', 'android_listpref_selected'),
],
title: 'Select an option',
cancelText: 'Cancel',
submitText: 'Save',
onlySaveOnSubmit: true,
),
),
PreferenceDialogLink(
'Android\'s "MultiSelectListPreference"',
dialog: PreferenceDialog(
[
CheckboxPreference('A enabled', 'android_multilistpref_a'),
CheckboxPreference('B enabled', 'android_multilistpref_b'),
CheckboxPreference('C enabled', 'android_multilistpref_c'),
],
title: 'Select multiple options',
cancelText: 'Cancel',
submitText: 'Save',
onlySaveOnSubmit: true,
),
),
[退出“设置”页面后,我尝试使用PrefService.getString('android_listpref_selected');
和其他变化形式,但我不断获得null
。任何帮助表示赞赏。
您可以在下面复制粘贴运行完整代码要确保正确保存值,可以在设置页面中使用PreferenceDialogLink
的onPop
调用setState
代码段
PreferenceDialogLink(
'Android\'s "ListPreference"',
dialog: PreferenceDialog(
[
RadioPreference(
'Select me!', 'select_1', 'android_listpref_selected'),
RadioPreference(
'Hello World!', 'select_2', 'android_listpref_selected'),
RadioPreference('Test', 'select_3', 'android_listpref_selected'),
],
title: 'Select an option',
cancelText: 'Cancel',
submitText: 'Save',
onlySaveOnSubmit: true,
),
onPop: () => setState(() {}),
),
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:preferences/preferences.dart';
import 'package:validators/validators.dart';
main() async {
WidgetsFlutterBinding.ensureInitialized();
await PrefService.init(prefix: 'pref_');
PrefService.setDefaultValues({
'user_description': 'This is my description!',
});
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Preferences Demo',
home: MyHomePage(title: 'Preferences Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: PreferencePage([
PreferenceTitle('General'),
PreferenceText(
PrefService.getString('android_listpref_selected') ?? '',
style: TextStyle(color: Colors.grey),
),
PreferenceDialogLink(
'Android\'s "ListPreference"',
dialog: PreferenceDialog(
[
RadioPreference(
'Select me!', 'select_1', 'android_listpref_selected'),
RadioPreference(
'Hello World!', 'select_2', 'android_listpref_selected'),
RadioPreference('Test', 'select_3', 'android_listpref_selected'),
],
title: 'Select an option',
cancelText: 'Cancel',
submitText: 'Save',
onlySaveOnSubmit: true,
),
onPop: () => setState(() {}),
),
]),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
},
child: Icon(Icons.navigation),
backgroundColor: Colors.green,
),
);
}
}
class SecondRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('${PrefService.getString('android_listpref_selected')}');
return Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Column(
children: <Widget>[
Text('${PrefService.getString('android_listpref_selected')}'),
],
),
);
}
}