简体   繁体   English

在颤振应用程序中持久化数据

[英]Persisting data in a flutter application

I am building an app and in it, I have the names of people in a list from which I could add/delete, etc.. The problem is this list is not saved when I close the app, which is inconvenient.我正在构建一个应用程序,其中包含一个列表中的人员姓名,我可以从中添加/删除等。问题是当我关闭应用程序时,这个列表没有保存,这很不方便。

I heard you can use shared Preferences to save simple objects like this, without complicating things like using SQLite and json.我听说你可以使用共享首选项来保存这样的简单对象,而不会像使用 SQLite 和 json 这样复杂化。

So I'd like to know what's the suggested way to persist this data and load it etc.所以我想知道保留这些数据并加载它等的建议方法是什么。

Thanks in Advance and have a great day :)提前致谢,祝您有美好的一天:)

Here is the code:这是代码:

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

And the NewPerson object:和 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,
            ),
          ],
        ),
      ),
    );
  }
}

You could use this functions to persist and load data from shared preferences.您可以使用此函数从共享首选项中保存和加载数据。

Get SharedPreferences from here .这里获取 SharedPreferences。

To persist data to SharedPreferences, called after adding or deleting a new element to the list.将数据保存到 SharedPreferences,在向列表中添加或删除新元素后调用。

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

To load data from SharedPreferences, usually called in initState .从 SharedPreferences 加载数据,通常在initStateinitState

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM