[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9103":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":24,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":16,"starSnapshotCount":16,"syncStatus":32,"lastSyncTime":33,"discoverSource":34},9103,"flutter_architecture_samples","brianegan\u002Fflutter_architecture_samples","brianegan","TodoMVC for Flutter","http:\u002F\u002Ffluttersamples.com\u002F",null,"Dart",8925,1716,270,38,0,3,10,1,68.2,"BSD 3-Clause \"New\" or \"Revised\" License",false,"main",true,[26,27,28],"dart","flutter","redux","2026-06-12 04:00:43","# flutter_architecture_samples\n\n[![Build Status](https:\u002F\u002Fgithub.com\u002Fbrianegan\u002Fflutter_architecture_samples\u002Factions\u002Fworkflows\u002Fanalyze_test_build.yml\u002Fbadge.svg?branch=main)](https:\u002F\u002Fgithub.com\u002Fbrianegan\u002Fflutter_architecture_samples\u002Factions\u002Fworkflows\u002Fanalyze_test_build.ymll)\n[![codecov](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fbrianegan\u002Fflutter_architecture_samples\u002Fbranch\u002Fmain\u002Fgraph\u002Fbadge.svg)](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fbrianegan\u002Fflutter_architecture_samples)\n\n\u003Cimg align=\"right\" src=\"assets\u002Ftodo-list.png\" alt=\"List of Todos Screen\">\n\n[TodoMVC](http:\u002F\u002Ftodomvc.com) for Flutter!\n\nFlutter provides a lot of flexibility in deciding how to organize and architect\nyour apps. While this freedom is very valuable, it can also lead to apps with\nlarge classes, inconsistent naming schemes, as well as mismatching or missing\narchitectures. These types of issues can make testing, maintaining and extending\nyour apps difficult.\n\nThe Flutter Architecture Samples project demonstrates strategies to help solve\nor avoid these common problems. This project implements the same app using\ndifferent architectural concepts and tools.\n\nYou can use the samples in this project as a learning reference, as a roughly\napples-to-apples comparison of different approaches, or as a starting point for\ncreating your own apps. The focus of this project is on demonstrating how to\nstructure your code, design your architecture, and the eventual impact of\nadopting these patterns on testing and maintaining your app. You can use the\ntechniques demonstrated here in many different ways to build apps. Your own\nparticular priorities will impact how you implement the concepts in these\nprojects, so you should not consider these samples to be canonical examples. To\nensure the focus is kept on the aims described above, the app uses a simple UI.\n\n### Current Samples\n\n- [Vanilla Lifting State Up Example](vanilla) ([Web Demo](https:\u002F\u002Ffas-vanilla.netlify.app)) - Uses the tools Flutter provides out of the box to manage app state.\n- [InheritedWidget Example](inherited_widget) ([Web Demo](https:\u002F\u002Ffas-inherited-widget.netlify.app)) - Uses an InheritedWidget to pass app state down the widget hierarchy.\n- [Change Notifier + Provider Example](change_notifier_provider) ([Web Demo](https:\u002F\u002Ffas-change-notifier-provider.netlify.app)) - Uses the [ChangeNotifier](https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Ffoundation\u002FChangeNotifier-class.html) class from Flutter with [provider](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fprovider) package now recommended by the Flutter team.\n- [Freezed + Provider + Value Notifier](freezed_provider_value_notifier) ([Web Demo](https:\u002F\u002Ffas-freezed-provider-value-notifier.netlify.app)) - Uses the [ValueNotifier](https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Ffoundation\u002FValueNotifier-class.html) class from Flutter with [provider](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fprovider) package.\n- [BLoC Example](bloc_flutter) ([Web Demo](https:\u002F\u002Ffas-bloc-flutter.netlify.app\u002F)) - An implementation of the original [BLoC pattern](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=PLHln7wHgPE&list=PLOU2XLYxmsIIJr3vjxggY7yGcGO7i9BK5&index=13) described by Paolo Soares at DartConf 2018, which uses Sinks for Inputs and Streams for Outputs\n- [Bloc Library Example](bloc_library) ([Web Demo](https:\u002F\u002Ffas-bloc-library.netlify.app)) - Uses the [bloc](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fbloc) and [flutter_bloc](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fflutter_bloc) libraries to manage app state and update Widgets.\n- [MobX Example](mobx) ([Web Demo](https:\u002F\u002Ffas-mobx.netlify.app)) - Uses the [MobX](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fmobx) library to manage app state and update widgets using `Observables`, `Actions` and `Reactions`.\n- [Redux Example](redux) ([Web Demo](https:\u002F\u002Ffas-redux.netlify.app)) - Uses the [Redux](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fredux) library to manage app state and update Widgets\n- [\"Simple\" BLoC Example](simple_bloc_flutter) ([Web Demo](https:\u002F\u002Ffas-simple-bloc.netlify.app\u002F)) - Similar to the BLoC pattern, but uses Functions for Inputs and Streams for Outputs. Results in far less code compared to original BLoC pattern if code sharing with AngularDart apps isn't an important use case for your app.\n- [Signals Example](signals) ([Web Demo](https:\u002F\u002Ffas-signals.netlify.app)) - Uses the [Signals](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fsignals) package by [Rody Davis](https:\u002F\u002Fpub.dev\u002Fpublishers\u002Frodydavis.com\u002Fpackages).\n- [MVI Example](mvi_flutter) ([Web Demo](https:\u002F\u002Ffas-mvi.netlify.app)) - Uses the concepts from [Cycle.JS](https:\u002F\u002Fcycle.js.org\u002F) and applies them to Flutter.\n- [scoped_model Example](scoped_model) ([Web Demo](https:\u002F\u002Ffas-scoped-model.netlify.app)) - Uses the [scoped_model](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fscoped_model) library to hold app state and notify Widgets of Updates\n\n### Supporting Code\n\n- [integration_tests](integration_tests) - Demonstrates how to write\nselenium-style integration (aka end to end) tests using the Page Object Model.\nThis test suite is run against all samples.\n- [todos_repository_core](todos_repository_core) - Defines the core abstract\nclasses for loading and saving data so that storage can be implemented in\nvarious ways, such as file storage or firebase for mobile projects, or\nwindow.localStorage for web projects.\n- [todos_repository_local_storage](todos_repository_local_storage) - Implements\nthe todos repository using the file system, window.localStorage, and\nSharedPreferences as the data source.\n\n### Running the samples\n\n```\ncd \u003Csample_directory>\nflutter run \n```\n\n### Why a todo app?\n\nThe app in this project aims to be as simple as possible while still showcasing\ndifferent design decisions and testing scenarios. For more information, see the\n[app's specification](app_spec.md).\n\n### Be excellent to each other\n\nThis Repo is meant as a discussion platform for various architectures. Let us\ndebate these ideas vigorously, but let us be excellent to each other in the\nprocess!\n\nWhile healthy debate and contributions are very welcome, trolls are not. Read\nthe [code of conduct](code-of-conduct.md) for detailed information.\n\n### Contributing\n\nFeel free to join in the discussion, file issues, and we'd love to have more\nsamples added! Please read the [CONTRIBUTING](CONTRIBUTING.md) file for guidance\n:)\n\n### License\n\nAll code in this repo is MIT licensed.\n\n## Attribution\n\nAll of these ideas and even some of the language are directly influenced by two\nprojects:\n\n- [TodoMVC](http:\u002F\u002Ftodomvc.com) - A Todo App implemented in various JS frameworks\n- [Android Architecture Blueprints](https:\u002F\u002Fgithub.com\u002Fgooglesamples\u002Fandroid-architecture) - A similar concept, but for Android! The UI and app spec was highly inspired by their example.\n\n## Contributors\n\n- [Brian Egan](https:\u002F\u002Fgithub.com\u002Fbrianegan)\n- [Maurice McCabe](https:\u002F\u002Fgithub.com\u002Fmmcc007)\n- [David Marne](https:\u002F\u002Fgithub.com\u002Fdavidmarne)\n- [Pascal Welsch](https:\u002F\u002Fgithub.com\u002Fpasssy)\n- [Larry King](https:\u002F\u002Fgithub.com\u002Fkinggolf)\n- [Frank Harper](https:\u002F\u002Fgithub.com\u002Ffranklinharper)\n- [Pavel Shilyagov](https:\u002F\u002Fgithub.com\u002Fp69)\n- [Leo Cavalcante](https:\u002F\u002Fgithub.com\u002Fleocavalcante)\n- [Greg Perry](https:\u002F\u002Fgithub.com\u002FAndriousSolutions)\n- [Felix Angelov](https:\u002F\u002Fgithub.com\u002Ffelangel)\n- [Francesco Mineo](https:\u002F\u002Fgithub.com\u002Ffrideosapps)\n- [Pavan Podila](https:\u002F\u002Fgithub.com\u002Fpavanpodila)\n- [Kushagra Saxena](https:\u002F\u002Fgithub.com\u002Fkush3107)\n- [Shakib Hossain](https:\u002F\u002Fgithub.com\u002Fshakib609)\n- [Mellati Fatah](https:\u002F\u002Fgithub.com\u002FGIfatahTH)\n\nI'd like to thank all of the folks who have helped write new samples, improve\nthe current implementations, and added documentation! You're amazing! :)\n","该项目为Flutter提供了多种架构样本，实现了基于TodoMVC的应用。核心功能包括使用不同的架构概念和工具（如Vanilla、InheritedWidget、ChangeNotifier+Provider、Freezed+Provider+ValueNotifier以及BLoC模式）来组织和管理应用状态。技术特点在于通过对比不同方法，帮助开发者理解如何更好地结构化代码、设计架构，并评估这些模式对测试与维护的影响。适合于希望学习或比较不同架构方案的Flutter开发者，以及需要从实际例子出发构建自己应用的人士。",2,"2026-06-11 03:21:14","top_language"]