【问题标题】:retrieve stored shared preference value from another page with flutter_settings_screen使用 flutter_settings_screen 从另一个页面检索存储的共享偏好值
【发布时间】:2020-04-10 03:06:13
【问题描述】:

我正在使用这个插件flutter_settings_screen,但不知道如何从另一个页面获取存储值。我应该使用Settings.getValue<bool>('key_wifi', false) 从“AppSettings”页面检索 key_wifi

这是我工作的完整简单代码:

import 'package:draft/app_settings.dart';
import 'package:flutter/material.dart';
import 'package:flutter_settings_screens/flutter_settings_screens.dart';

final bool isWifiEnabled = Settings.getValue<bool>('key_wifi', false);

void main() {
  initSettings();
  runApp(MyApp());
}

void initSettings() {
  SharePreferenceCache spCache = SharePreferenceCache()
    ..init();
  Settings.init(cacheProvider: spCache);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MyHomePage(title: 'Flutter Demo Home Page');
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App Settings Demo',
      theme: ThemeData.dark(),
      home: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(
          child: Column(
            children: <Widget>[
              isWifiEnabled? Text("Wifi is ON") : Text("Wifi is OFF"),
              RaisedButton(
                child: Text("Open Settings"),
                onPressed: () {
                  Navigator.push(context, MaterialPageRoute(
                builder: (context) => AppSettings()));
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class AppSettings extends StatefulWidget {
  @override
  _AppSettingsState createState() => _AppSettingsState();
}

String keywifi = 'keywifi';

class _AppSettingsState extends State<AppSettings> {

  final bool isWifiEnabled = Settings.getValue<bool>(keywifi, false);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: SettingsScreen(
        title: "Application Settings",
        children: [
          SettingsGroup(
            title: 'Single Choice Settings',
            children: <Widget>[
              SwitchSettingsTile(
                settingKey: 'key_wifi',
                title: 'Wi-Fi',
                enabledLabel: 'Enabled',
                disabledLabel: 'Disabled',
                leading: Icon(Icons.wifi),
                onChange: (value) {
                  debugPrint('keywifi: $value');
                },
              ),
            ],
          ),
        ],
      ),
    );
  }
}

【问题讨论】:

    标签: flutter sharedpreferences


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    第一步:你需要awaitinitSettings()
    第二步:你需要await spCache.init();

    Future<void> initSettings() async {
          SharePreferenceCache spCache = SharePreferenceCache();
          await spCache.init();
          await Settings.init(cacheProvider: spCache);
        }
    

    第 3 步:直接使用Settings.getValue

    Settings.getValue<bool>('key_wifi', false)
                    ? Text("Wifi is ON")
                    : Text("Wifi is OFF"),
    

    第 4 步:await Navigator.pushsetState

    onPressed: () async {
                    await Navigator.push(context,
                        MaterialPageRoute(builder: (context) => AppSettings()));
                    setState(() {});
    

    第 5 步:拼写错误 String keywifi = 'keywifi'; 将 'keywifi' 更改为 'key_wifi'

    工作演示

    完整代码

    //import 'package:draft/app_settings.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter_settings_screens/flutter_settings_screens.dart';
    
    //final bool isWifiEnabled = Settings.getValue<bool>('key_wifi', false) ?? false;
    
    Future<void> main() async {
      await initSettings();
    
      runApp(MyApp());
    }
    
    Future<void> initSettings() async {
      SharePreferenceCache spCache = SharePreferenceCache();
      await spCache.init();
      await Settings.init(cacheProvider: spCache);
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'App Settings Demo',
            theme: ThemeData.dark(),
            home: MyHomePage(title: 'Flutter Demo Home Page'));
      }
    }
    
    class MyHomePage extends StatefulWidget {
      final String title;
    
      const MyHomePage({Key key, this.title}) : super(key: key);
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              children: <Widget>[
                Settings.getValue<bool>('key_wifi', false)
                    ? Text("Wifi is ON")
                    : Text("Wifi is OFF"),
                RaisedButton(
                  child: Text("Open Settings"),
                  onPressed: () async {
                    await Navigator.push(context,
                        MaterialPageRoute(builder: (context) => AppSettings()));
                    setState(() {});
                  },
                ),
              ],
            ),
          ),
        );
      }
    }
    
    class AppSettings extends StatefulWidget {
      @override
      _AppSettingsState createState() => _AppSettingsState();
    }
    
    String keywifi = 'key_wifi';
    
    class _AppSettingsState extends State<AppSettings> {
      final bool isWifiEnabled = Settings.getValue<bool>(keywifi, false);
      @override
      Widget build(BuildContext context) {
        return Container(
          child: SettingsScreen(
            title: "Application Settings",
            children: [
              SettingsGroup(
                title: 'Single Choice Settings',
                children: <Widget>[
                  SwitchSettingsTile(
                    settingKey: 'key_wifi',
                    title: 'Wi-Fi',
                    enabledLabel: 'Enabled',
                    disabledLabel: 'Disabled',
                    leading: Icon(Icons.wifi),
                    onChange: (value) {
                      debugPrint('keywifi: $value');
                    },
                  ),
                ],
              ),
            ],
          ),
        );
      }
    }
    

    【讨论】:

    • 我收到了消息 'await' applied to 'void', which is not a 'Future' 我应该忽略它吗?
    • 我已更新完整代码。请再试一次。未来 initSettings()
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2012-05-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多