RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1020542
Accepted
fantik
fantik
Asked:2020-09-05 15:55:52 +0000 UTC2020-09-05 15:55:52 +0000 UTC 2020-09-05 15:55:52 +0000 UTC

在应用关闭时保存列表视图数据

  • 772

我有一个用颤振编写的 TODO 应用程序,我希望在关闭应用程序时保存列表视图中添加的文本。听说可以添加共享偏好,但是最近在编程,不知道怎么实现。main.dart

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


void main() => runApp(new TodoApp());


class TodoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Todo List',
        home: new TodoList()
    );
  }
}

class TodoList extends StatefulWidget {
  @override
  createState() => new TodoListState();
}

class TodoListState extends State<TodoList> {
  String _haveStarted3Times = '';
  List<String> _todoItems = [];

  void _addTodoItem(String task) {
    if(task.length > 0) {

      setState(() => _todoItems.add(task));
    }
  }

  void _removeTodoItem(int index) {
    setState(() => _todoItems.removeAt(index));
  }

  void _promptRemoveTodoItem(int index) {
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return new AlertDialog(
              title: new Text('Задача "${_todoItems[index]}" выполнена?'),
              actions: <Widget>[
                new FlatButton(
                    child: new Text('отмена'),
                    onPressed: () => Navigator.of(context).pop()
                ),
                new FlatButton(
                    child: new Text('выполнена'),
                    onPressed: () {
                      _removeTodoItem(index);
                      Navigator.of(context).pop();
                    }
                )
              ]
          );
        }
    );
  }


  Widget _buildTodoList() {
    return new ListView.builder(
      itemBuilder: (context, index) {
        if(index < _todoItems.length) {
          return _buildTodoItem(_todoItems[index], index);
        }
      },
    );
  }

  Widget _buildTodoItem(String todoText, int index) {
    return new ListTile(
        title: new Text(todoText),
        onTap: () => _promptRemoveTodoItem(index)
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
          title: new Text('Todo List')
      ),
      body: _buildTodoList(),
      floatingActionButton: new FloatingActionButton(
          onPressed: _pushAddTodoScreen,
          tooltip: 'Add task',
          child: new Icon(Icons.add)
      ),
    );
  }

  void _pushAddTodoScreen() {
    // Push this page onto the stack
    Navigator.of(context).push(
        new MaterialPageRoute(
            builder: (context) {
              return new Scaffold(
                  appBar: new AppBar(
                      title: new Text('добавление задачи')
                  ),
                  body: new TextField(
                    autofocus: true,
                    onSubmitted: (val) {
                      _addTodoItem(val);
                      Navigator.pop(context); // Close the add todo screen
                    },
                    decoration: new InputDecoration(
                        hintText: 'Введите вашу задачу',
                        contentPadding: const EdgeInsets.all(16.0)
                    ),
                  )
              );
            }
        )
    );
  }
}
listview
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MiT
    2020-09-05T19:12:48Z2020-09-05T19:12:48Z

    这是一个使用Shared Preferences的简单实现示例。这段代码可以优化。我不建议使用 Shared Preferences 来存储重要数据,因为它适用于简单数据(如设置)。对于更重要的数据,您需要使用 DB。

    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    void main() => runApp(new TodoApp());
    
    class TodoApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
            debugShowCheckedModeBanner: false,
            title: 'Todo List',
            home: new TodoList());
      }
    }
    
    class TodoList extends StatefulWidget {
      @override
      createState() => new TodoListState();
    }
    
    class TodoListState extends State<TodoList> {
      String _haveStarted3Times = '';
      List<String> _todoItems = [];
    
      @override
      Widget build(BuildContext context) {
        _getPrefs();
        return new Scaffold(
          appBar: new AppBar(title: new Text('Todo List')),
          body: _buildTodoList(),
          floatingActionButton: new FloatingActionButton(
              onPressed: _addTodoItem,
              tooltip: 'Add task',
              child: new Icon(Icons.add)),
        );
      }
    
      Widget _buildTodoList() {
        return new ListView.builder(itemBuilder: (context, index) {
          if (index < _todoItems.length) {
            return _buildTodoItem(_todoItems[index], index);
          }
        });
      }
    
      Widget _buildTodoItem(String todoText, int index) {
        return new ListTile(
            title: new Text(todoText), onTap: () => _removeTodoItem(index));
      }
    
      void _addTodoItem() {
        // Push this page onto the stack
        Navigator.of(context).push(new MaterialPageRoute(builder: (context) {
          return new Scaffold(
              appBar: new AppBar(title: new Text('добавление задачи')),
              body: new TextField(
                autofocus: true,
                onSubmitted: (val) {
                  _addItem(val);
                  Navigator.pop(context); // Close the add todo screen
                },
                decoration: new InputDecoration(
                    hintText: 'Введите вашу задачу',
                    contentPadding: const EdgeInsets.all(16.0)),
              ));
        }));
      }
    
      void _addItem(String task) {
        if (task.length > 0) {
          setState(() => _todoItems.add(task));
          _setPrefs();
        }
      }
    
      void _removeTodoItem(int index) {
        showDialog(
            context: context,
            builder: (BuildContext context) {
              return new AlertDialog(
                  title: new Text('Задача "${_todoItems[index]}" выполнена?'),
                  actions: <Widget>[
                    new FlatButton(
                        child: new Text('отмена'),
                        onPressed: () => Navigator.of(context).pop()),
                    new FlatButton(
                        child: new Text('выполнена'),
                        onPressed: () {
                          _removeItem(index);
                          Navigator.of(context).pop();
                        })
                  ]);
            });
      }
    
      void _removeItem(int index) {
        setState(() => _todoItems.removeAt(index));
        _setPrefs();
      }
    
      void _setPrefs() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        prefs.setStringList('TodoList', _todoItems);
      }
    
      void _getPrefs() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        if (prefs.getStringList('TodoList') != null)
          _todoItems = prefs.getStringList('TodoList');
      }
    }
    
    • 2

相关问题

  • 滚动列表ReactNative时如何禁用隐藏键盘

  • C++\CLI,引用ListView中的字符串

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5