{"id":15497975,"url":"https://github.com/rodydavis/provider_persist","last_synced_at":"2025-04-22T22:30:18.735Z","repository":{"id":101928844,"uuid":"191622649","full_name":"rodydavis/provider_persist","owner":"rodydavis","description":"Persist your UI State with Provider.","archived":false,"fork":false,"pushed_at":"2019-06-12T18:51:59.000Z","size":40691,"stargazers_count":20,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-18T17:30:44.044Z","etag":null,"topics":["dart","flutter","provider","task-manager","todo"],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rodydavis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-12T18:14:39.000Z","updated_at":"2021-12-21T09:19:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"f82eaa6f-07f5-40c5-b0a3-54e7ce2c14e8","html_url":"https://github.com/rodydavis/provider_persist","commit_stats":null,"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fprovider_persist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fprovider_persist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fprovider_persist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fprovider_persist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rodydavis","download_url":"https://codeload.github.com/rodydavis/provider_persist/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250333827,"owners_count":21413466,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dart","flutter","provider","task-manager","todo"],"created_at":"2024-10-02T08:41:33.401Z","updated_at":"2025-04-22T22:30:18.716Z","avatar_url":"https://github.com/rodydavis.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# provider_persist\n\nA Flutter Template to show how to persist provider.\n\n## Getting Started\n\nExample of how to persist UI state with [Provider](https://pub.dev/packages/provider).\n\n![task-screen](https://github.com/AppleEducate/provider_persist/blob/master/screenshots/1.png)\n\n## UI\n\n``` dart\nimport 'package:flutter/material.dart';\nimport 'package:provider/provider.dart';\n\nimport '../../data/classes/index.dart';\nimport '../../data/models/index.dart';\nimport '../index.dart';\n\nclass TasksScreen extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Flutter Task Manager'),\n      ),\n      body: Consumer\u003cTaskProvider\u003e(\n        builder: (context, model, child) {\n          if (model?.tasks == null) {\n            return Center(\n              child: CircularProgressIndicator(),\n            );\n          }\n          if (model.tasks.isEmpty) {\n            return Center(\n              child: Text('No Tasks Found'),\n            );\n          }\n          return ListView.separated(\n            separatorBuilder: (context, index) =\u003e Divider(),\n            itemCount: model.tasks.length,\n            itemBuilder: (context, index) {\n              final _item = model.tasks[index];\n              return ListTile(\n                title: Text(_item.name),\n                trailing: IconButton(\n                  icon: Icon(Icons.delete),\n                  onPressed: () =\u003e model.deleteTask(index),\n                ),\n                onTap: () =\u003e _editTask(context, _item, index),\n              );\n            },\n          );\n        },\n      ),\n      floatingActionButton: FloatingActionButton(\n        child: Icon(Icons.add),\n        onPressed: () =\u003e _addTask(context),\n      ),\n    );\n  }\n\n  void _addTask(BuildContext context) async {\n    final _task = await Navigator.push\u003cTask\u003e(\n        context,\n        MaterialPageRoute(\n          builder: (_) =\u003e EditTaskScreen(),\n          fullscreenDialog: true,\n        ));\n\n    if (_task != null) {\n      final _model = Provider.of\u003cTaskProvider\u003e(context);\n      _model.addTask(_task);\n    }\n  }\n\n  void _editTask(BuildContext context, Task task, int index) async {\n    final _task = await Navigator.push\u003cTask\u003e(\n        context,\n        MaterialPageRoute(\n          builder: (_) =\u003e EditTaskScreen(task: task),\n          fullscreenDialog: false,\n        ));\n\n    if (_task != null) {\n      final _model = Provider.of\u003cTaskProvider\u003e(context);\n      _model.editTask(index, _task);\n    }\n  }\n}\n\n```\n\n## Model\n\n``` dart\nimport 'package:flutter/cupertino.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:localstorage/localstorage.dart';\n\nimport '../classes/index.dart';\n\npart 'task_state.g.dart';\n\nclass TaskProvider extends ChangeNotifier {\n  TaskState _state;\n  final String _stateKey = 'state';\n  final _storage = LocalStorage('Task-state');\n\n  void init() async {\n    await _storage.ready;\n\n    final _data = _storage.getItem(_stateKey);\n\n    try {\n      if (_data != null) {\n        _state = TaskState.fromJson(_data);\n      }\n    } catch (e) {\n      print('Error Loading Task State: $e');\n    }\n\n    if (_data == null) {\n      _state = TaskState(tasks: []);\n    }\n    notifyListeners();\n  }\n\n  List\u003cTask\u003e get tasks =\u003e _state?.tasks;\n\n  void addTask(Task value) {\n    _state.tasks.add(value);\n    notifyListeners();\n    _saveState();\n  }\n\n  void editTask(int index, Task value) {\n    _state.tasks[index] = value;\n    notifyListeners();\n    _saveState();\n  }\n\n  void deleteTask(int index) {\n    _state.tasks.removeAt(index);\n    notifyListeners();\n    _saveState();\n  }\n\n  void _saveState() async =\u003e await _storage.setItem(_stateKey, _state.toJson());\n}\n\n@JsonSerializable(nullable: false, explicitToJson: true)\nclass TaskState {\n  TaskState({this.tasks});\n\n  factory TaskState.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$TaskStateFromJson(json);\n\n  List\u003cTask\u003e tasks;\n\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$TaskStateToJson(this);\n}\n\n```\n\n## Class\n\nTo update run: `flutter packages pub run build_runner watch  —delete-conflicting-outputs`\n\n``` dart\nimport 'package:flutter/foundation.dart';\nimport 'package:json_annotation/json_annotation.dart';\n\npart 'task.g.dart';\n\n@JsonSerializable(nullable: false)\nclass Task {\n  final String name;\n  final bool active;\n  final DateTime dataCreated;\n  Task({\n    @required this.name,\n    @required this.dataCreated,\n    this.active: true,\n  });\n\n  factory Task.fromJson(Map\u003cString, dynamic\u003e json) =\u003e _$TaskFromJson(json);\n\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$TaskToJson(this);\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodydavis%2Fprovider_persist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frodydavis%2Fprovider_persist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodydavis%2Fprovider_persist/lists"}