【问题标题】:How To Retrieve RadioPreference, CheckPreference values in Preferences in Flutter如何在 Flutter 的 Preferences 中检索 RadioPreference、CheckPreference 值
【发布时间】:2020-03-22 16:11:04
【问题描述】:

我很难在使用 Preferences 库 https://pub.dev/packages/preferences# 的颤振项目中检索多个 RadioPreference 中的用户首选项。我知道如何在 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 的其他变体。 任何帮助表示赞赏。

【问题讨论】:

    标签: flutter sharedpreferences preferences


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    为了确保正确保存值,您可以在设置页面中使用PreferenceDialogLinkonPop调用setState

    代码sn-p

    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')}'),
            ],
          ),
        );
      }
    }
    

    【讨论】:

    • 谢谢,但我发现一旦我选择第一个选项并保存,离开页面并返回设置页面,即使我选择另一个选项,第一个选项仍然保持粘性,现在我看到两个选择的选项
    • 我无法在我的示例中重现此问题。
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 2019-11-14
    • 2021-08-28
    • 2018-06-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多