Общие префы с Flutter, что я делаю не так? - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь использовать 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();
  }
}

Чтоя делаю не так?заранее благодарю за помощь

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы также можете достичь без 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');
      }
    }
0 голосов
/ 03 октября 2018

Это потому, что ваш метод 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)
                    ],
                  ),
                ),
              );
            },
          ),
        );
      }
...