在不稳定的应用程序中保留数据

时间:2019-12-27 10:17:06

标签: android ios flutter dart

我正在构建一个应用程序,并且在其中有可以添加/删除列表的人员名称,等等。问题是,当我关闭该应用程序时,该列表没有保存。这很不方便。

我听说您可以使用共享的“首选项”来保存这样的简单对象,而不会像使用SQLite和json那样使事情复杂化。

所以我想知道什么是建议的持久化数据并加载等的方法。

多谢您,并祝您愉快:)

代码如下:

import 'package:flutter/material.dart';
import 'package:zakif_yomi3/NewPerson.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {

  final List<String> people = [];

  void _addNewPerson(String name) {
    setState(() {
      people.add(name);
    });
  }

  void _startAddNewPerson(BuildContext ctx) {
    showModalBottomSheet(
      context: ctx,
      builder: (_) {
        return GestureDetector(
          onTap: () {},
          child: NewPerson(_addNewPerson),
          behavior: HitTestBehavior.opaque,
        );
      },
    );
  }
void _deletePerson(int value  ) {

    setState(() {
      people.removeAt(value);
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text(
          'People',
          style: TextStyle(fontSize: 30),
        ),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.add),
            onPressed: () => _startAddNewPerson(context),
          )
        ],
      ),
      body: ListView.builder(
        itemCount: this.people.length,
        itemBuilder: (context, value) {
          return Card(
            color: Colors.amberAccent[200],
            elevation: 3,
            child: Container(
              child: ListTile(
                leading: Text(value.toString()),
                title: Text(
                  people[value],
                ),
                trailing: IconButton(
                  icon: Icon(Icons.delete),
                  onPressed: () {
                    _deletePerson(value);
                  },
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

还有NewPerson对象:

import 'package:flutter/material.dart';


class NewPerson extends StatefulWidget {
  final Function addTx;

  NewPerson(this.addTx);

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

class _NewPersonState extends State<NewPerson> {
  final _nameController = TextEditingController();



  void _submitData() {

    final name = _nameController.text;


    widget.addTx(
     name
    );

    Navigator.of(context).pop();
  }



  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 5,
      child: Container(
        padding: EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.end,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: 'Name'),
              controller: _nameController,
              onSubmitted: (_) => _submitData(),

            ),


            RaisedButton(
              child: Text('Add Person'),
              color: Theme.of(context).primaryColor,
              textColor: Theme.of(context).textTheme.button.color,
              onPressed: _submitData,
            ),
          ],
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:1)

您可以使用此功能来持久存储和加载共享首选项中的数据。

here获取SharedPreferences。

要将数据持久保存到SharedPreferences中,在向列表添加或删除新元素后调用。

_persistData() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    await preferences.setStringList("persons", _people);
  }

要从通常在initState中调用的SharedPreferences中加载数据。

_loadData() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    setState(() {
      _people = preferences.getStringList("persons");
    });
  }