【问题标题】:Shared Prefs with Flutter, what am I doing wrong?与 Flutter 共享首选项,我做错了什么?
【发布时间】:2019-03-08 21:10:58
【问题描述】:

我正在尝试使用 sharedprefs 来简化数据持久性 跨不同的页面/片段,(忽略这里和那里写的“json”) 在你问之前,这只是针对一次性数据,应用程序将基于 SQL 构建。

所以我创建了一个类来处理 sharedprefs

import 'dart:async';
import 'package:shared_preferences/shared_preferences.dart';

class JsonHelper {
  Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

   getJson(String _key) async {
    final SharedPreferences prefs = await _prefs;
    final String _json = prefs.getString('$_key');
    return _json;
  }

  setJson(String _key, String _json) async {
    final SharedPreferences prefs = await _prefs;
    prefs.setString('$_key', _json);
  }

  delJson(String _key) async {
  final prefs = await SharedPreferences.getInstance();
  prefs.remove('$_key');
  }
}

还有一个“简单”的主页,简单到不行

import 'package:flutter/material.dart';
import 'package:flutter_3/DATABASE/JsonHelper.dart';

class LandingPage extends StatefulWidget {
  @override
  _LandingPageState createState() => _LandingPageState();
}

class _LandingPageState extends State<LandingPage> {
  JsonHelper _jHelp;
  String _localKey = 'test';
  TextEditingController _textCTRL;

  @override
  void initState() {
    _jHelp.setJson(_localKey, "start");
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(_jHelp.getJson(_localKey)),
        ),
        body: Center(
          child: Column(
            children: [
              TextField(
                controller: _textCTRL,
                decoration: InputDecoration(labelText: 'write here'),
              ),

              RaisedButton(onPressed:_pressButton)
            ],
          ),
        ),
      ),
    );
  }

  void _pressButton () {
    _jHelp.setJson(_localKey, _textCTRL.toString());
    Navigator.of(context).pop();
  }
}

我做错了什么? 提前感谢您的帮助

【问题讨论】:

  • 您似乎没有创建要使用的 JsonHelperclass 的实例。在进行任何方法调用之前,我会将_jHelp = JsonHelper() 添加到initState
  • 你得到的错误是什么?解释“不起作用”
  • 之前的错误是"setJson("test","start") 在遵循 albert 建议(感谢 albert)后在 null 上调用它返回“type Future is not a subtype of type 'String'" 我想我只需要摆脱这个类并在每个页面每次都调用常规方式:(

标签: dart flutter sharedpreferences data-persistence


【解决方案1】:

那是因为你的getJson方法是异步的,你可以使用FutureBuilder来获取响应,看这里:https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html

   @override
    Widget build(BuildContext context) {
        return MaterialApp(
          home: FutureBuilder(
            initialData: "",
            future: _jHelp.getJson(_localKey),
            builder: (context, snapshot) {
              return Scaffold(
                appBar: AppBar(
                    title: Text(snapshot.data),
                    ),
                body: Center(
                  child: Column(
                    children: [
                      TextField(
                        controller: _textCTRL,
                        decoration: InputDecoration(labelText: 'write here'),
                      ),

                      RaisedButton(onPressed:_pressButton)
                    ],
                  ),
                ),
              );
            },
          ),
        );
      }

【讨论】:

  • 我仍然收到初始错误:NoSuchMethodError: The methos 'setJson' was called on null。接收者:null 尝试调用:setJson("test", "start") 但我没有考虑未来的构建者,我会进一步调查
  • 如果你不初始化你的对象,setJson 为 null
【解决方案2】:

没有 FutureBuilder 也可以实现。

   import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';

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

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'SharedPreferences Demo',
          home: LandingPage(),
        );
      }
    }

    class LandingPage extends StatefulWidget {
      @override
      _LandingPageState createState() => _LandingPageState();
    }

    class _LandingPageState extends State<LandingPage> {
      JsonHelper _jHelp;
      String _localKey = "test";
      TextEditingController _textCTRL;
      Future<String> data;
      String text = "start";
      final myController = TextEditingController();

      @override
      void initState() {
        _jHelp = JsonHelper();
        _jHelp.setJson(_localKey, "start");
        super.initState();
      }

      @override
      void dispose() {
        myController.dispose();
        super.dispose();
      }



      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home:  Scaffold(
            appBar: AppBar(
              title: Text(text),
            ),
            body: Center(
              child: Column(
                children: [
                  TextField(
                    controller: myController,
                    decoration: InputDecoration(labelText: 'write here'),
                  ),

                  RaisedButton(
                    onPressed:_pressButton,
                    child: new Text("check"),
                  )
                ],
              ),
            ),
          )
        );
      }

      void _pressButton () async{
        await _jHelp.setJson(_localKey,myController.text.toString());
        String getdata = await _jHelp.getJson(_localKey) as String;
        setState(() {
          text = getdata;
        });
      }
    }

    class JsonHelper {


       Future<String> getJson(String _key) async {
         SharedPreferences prefs = await SharedPreferences.getInstance();
        String _json = prefs.getString('$_key') ?? "start";
        return _json;
      }

       setJson(String _key, String _json) async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        prefs.setString('$_key',_json);
      }

      delJson(String _key) async {
        final prefs = await SharedPreferences.getInstance();
        prefs.remove('$_key');
      }
    }

【讨论】:

    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2023-02-13
    • 1970-01-01
    • 2018-10-03
    • 2023-03-23
    • 2020-04-14
    相关资源
    最近更新 更多