[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\n\nbuild/\nios/.generated/\nios/Flutter/Generated.xcconfig\nios/Runner/GeneratedPluginRegistrant.*\n\nlib/generated/\nres/\n.idea/\nandroid/\n\nlib/selectable_tags_back.dart\nexample/lib/main_back.dart\n"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: d48e6e433cc5ca67b24b19f70aaa197e84ba63c1\n  channel: beta\n\nproject_type: package\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "## [0.4.9+1] - 2020-11-11.\n\n* `[Fixed]` - Issue #66.\n* `[Fixed]` - `DataList` null id.\n\n## [0.4.9] - 2020-09-15.\n\n* `[Added]` - Possibility to to define the padding of the `textField`.\n\n## [0.4.8+2] - 2020-06-02.\n\n* `[Updated]` - Documentation.\n\n## [0.4.8+1] - 2020-05-13.\n\n* `[Updated]` - Documentation.\n\n## [0.4.8] - 2020-03-07.\n\n* `[Updated]` - Documentation.\n\n## [0.4.7] - 2020-02-26.\n\n* `[Updated]` -  Documentation.\n* General improvement of the code.\n\n## [0.4.6] - 2020-02-26.\n\n* `[Fixed]` -  some problem.\n* `[Added]` - Possibility to disabled/enabled `textField` field - Issue #36.\n* `[Added]` - Possibility to insert tags not present in the list of suggestions with the `constraintSuggestion` field - Issue #33.\n* `onRemoved` field has been moved inside `ItemTagsRemoveButton()` to maintain consistency.\n* `onRemoved` now has a bool return type (ex: when you want to add a control before removing a tag).\n\n## [0.4.5] - 2019-10-30.\n\n* Renamed `TagstextField` to `TagsTextField`.\n* Added `textCapitalization` field in `TagsTextField`.\n\n## [0.4.4] - 2019-10-16.\n\n* New Features and Documentation Updates.\n\n* Added `child` field in `ItemTagsImage()`, allows more control over the images.\n* Fixed alignment `textField` and `suggestions` - Issue #31.\n* Added the possibility to get a list of all the `ItemTags` via GlobalKey<TagsState>.\n\n## [0.4.3] - 2019-07-28.\n\n* Minor Update Documentation.\n* Fixed some problem.\n* removed the 'position' parameter  in TagsTexField () because it is not essential. the same result can be obtained by setting the verticalDirection and TextDirection parameters in Tags ().\n\n## [0.4.2] - 2019-07-27.\n\n* Update Documentation.\n* General improvement of the code.\n\n## [0.4.1] - 2019-07-27.\n\n* Minor Update Documentation.\n\n## [0.4.0] - 2019-07-27.\n\n* **Improvements, new Structure, new Features and Documentation Updates**\n*\n* `SelectableTags` and `InputTags`have been removed, now there is only one widget. **Tags()**\n* Now it is possible to personalize every single tag, with the possibility of adding icons, images and a removal button.\n* Possibility to display the list with horizontal scroll.\n\n## [0.3.2] - 2019-06-20.\n\n* Issue #14 and #13 fixed.\n* Added `customData` field in Tag Class.\n\n## [0.3.1] - 2019-05-13.\n\n* General improvement of the code.\n\n## [0.3.0] - 2019-04-09.\n\n* **New features**\n* Possibility to create a customizable popupMenu.\n* **SelectableTags**. Possibility to set a color and an activeColor for each tag.\n* **InputTags**. Possibility to hide textField.\n\n## [0.2.4] - 2019-04-08.\n\n* fixed some problem.\n\n## [0.2.3] - 2019-04-05.\n\n* General improvement of the code.\n* OnInsert, onDelete and onPressed are now optional.\n\n## [0.2.2] - 2019-03-02.\n\n* Added property `textStyle` in InputTags. NOTE: `textColor` has been removed. now it can be set with `textStyle`.\n* added property `textStyle` in SelectableTags. NOTE: if you set `color` in it will be ignored, you must use `textColor` `textActiveColor`.\n* Created InputSuggestions. Return suggestions in the TextField. Is not complete, soon the list of suggestions will be implemented.\n* General improvement of the code.\n\n## [0.2.1] - 2019-03-01.\n\n* The code has been largely rewritten.\n* Now the Tag width calculation is very accurate.\n\n## [0.2.0] - 2019-02-24.\n\n* Improved tag width calculation; \n* Possibility to change the margin and padding of the close icon ( InputTags ).\n\n## [0.1.9] - 2019-02-23.\n\n* Width calculated based on the byte length of the title; \n* When the orientation changes, a recalculation of the screen width is performed.\n\n## [0.1.8] - 2019-02-16.\n\n* Improvement of library documentation.\n\n## [0.1.7] - 2019-02-07.\n\n* Added new feature SingleItem on SelectableTags; \n* Possibility to change color/background-color icon on InputTags; - General improvement of the code.\n\n## [0.1.6] - 2019-01-07.\n\n* Fixed error \"Infinity or NaN toInt\" on InputTags; - general improvement of the code.\n\n## [0.1.5] - 2018-12-24.\n\n* General improvement of the code.\n\n## [0.1.4] - 2018-12-18.\n\n* Added new features.\n\n## [0.1.3] - 2018-12-16.\n\n* Added new highlight feature (InputTags) - general improvement of the code.\n\n## [0.1.2] - 2018-12-15.\n\n* Add InputTags Widget - Improved documentation.\n\n## [0.1.1] - 2018-12-08.\n\n* Improved documentation.\n\n## [0.1.0] - 2018-12-08.\n\n* Did some changing readme.\n\n## [0.0.1] - 2018-12-08.\n\n* Created Selectable Tags.\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2018 Antonino Di Natale\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE"
  },
  {
    "path": "README.md",
    "content": "# flutter_tags\n[![pub package](https://img.shields.io/badge/pub-0.4.9+1-orange.svg)](https://pub.dartlang.org/packages/flutter_tags)\n[![Awesome Flutter](https://img.shields.io/badge/Awesome-Flutter-blue.svg?longCache=true&style=flat-square)](https://github.com/Solido/awesome-flutter#ui)\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/dnag88)\n\nCreate beautiful tags quickly and easily.\n\n## Installing\nAdd this to your package's pubspec.yaml file:\n```dart\ndependencies:\n  flutter_tags: \"^0.4.9+1\"\n```\n\n\n## DEMO\n\n<div align=\"center\">\n<table>\n<tr>\n<td style=\"text-align:center\">\n <img width = \"250px\" src=\"https://github.com/Dn-a/flutter_tags/raw/master/repo-file/img/example0.4.0_1.gif\" />\n </td>\n <td style=\"text-align:center\">\n  <img width = \"250px\" src=\"https://github.com/Dn-a/flutter_tags/raw/master/repo-file/img/example0.4.0_2.gif\" />\n  </td>\n</tr>\n</table>\n</div>\n\n\n## Simple usage\n```dart\n\nimport 'package:flutter_tags/flutter_tags.dart';\n.\n.\n.\nList _items;\ndouble _fontSize = 14;\n\n@override\nvoid initState(){\n    super.initState();\n    // if you store data on a local database (sqflite), then you could do something like this\n    Model().getItems().then((items){\n            _items = items;\n        });\n}\n\n@override\nWidget build(BuildContext context) {\n    return Tags(\n      key:_tagStateKey,\n      textField: TagsTextField(\n        textStyle: TextStyle(fontSize: _fontSize),\n        constraintSuggestion: true, suggestions: [],\n        //width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 10),\n        onSubmitted: (String str) {\n          // Add item to the data source.\n          setState(() {\n              // required\n            _items.add(str);\n          });\n        },\n      ),\n      itemCount: _items.length, // required\n      itemBuilder: (int index){          \n            final item = _items[index];\n    \n            return ItemTags(\n                  // Each ItemTags must contain a Key. Keys allow Flutter to\n                  // uniquely identify widgets.\n                  key: Key(index.toString()),\n                  index: index, // required\n                  title: item.title,\n                  active: item.active,\n                  customData: item.customData,\n                  textStyle: TextStyle( fontSize: _fontSize, ),\n                  combine: ItemTagsCombine.withTextBefore,\n                  image: ItemTagsImage(\n                    image: AssetImage(\"img.jpg\") // OR NetworkImage(\"https://...image.png\")\n                  ), // OR null,\n                  icon: ItemTagsIcon(\n                    icon: Icons.add,\n                  ), // OR null,\n                  removeButton: ItemTagsRemoveButton(\n                    onRemoved: (){\n                        // Remove the item from the data source.\n                        setState(() {\n                            // required\n                            _items.removeAt(index);\n                        });\n                        //required\n                        return true;\n                    },\n                  ), // OR null,\n                  onPressed: (item) => print(item),\n                  onLongPressed: (item) => print(item),\n            );\n    \n      },\n    );    \n}\n\nfinal GlobalKey<TagsState> _tagStateKey = GlobalKey<TagsState>();\n// Allows you to get a list of all the ItemTags\n_getAllItem(){\n    List<Item> lst = _tagStateKey.currentState?.getAllItem;\n    if(lst!=null)\n        lst.where((a) => a.active==true).forEach( ( a) => print(a.title));        \n}\n```\n## Wrapped widget example\nYou are free to wrap ItemTags () inside another widget\n```dart\nTags(  \n      itemCount: items.length, \n      itemBuilder: (int index){ \n          return Tooltip(\n          message: item.title,\n          child:ItemTags(\n            title:item.title,\n          )\n          );\n      },\n    );    \n```\n### Tags() parameters\n|PropName|Description|default value|\n|:-------|:----------|:------------|\n|`columns`|*Possibility to set number of columns when necessary*|null|\n|`itemCount`|*Tag number to display*|required|\n|`symmetry`|*Ability to view and scroll tags horizontally*|false|\n|`horizontalScroll`|*Offset drawer width*|0.4|\n|`heightHorizontalScroll`|*height for HorizontalScroll to set to display tags correctly*|60|\n|`spacing`|*Horizontal space between the tags*|6|\n|`runSpacing`|*Vertical space between the tags*|14|\n|`alignment`|*Horizontal WrapAlignment*|WrapAlignment.center|\n|`runAlignment`|*Vertical WrapAlignment*|WrapAlignment.center|\n|`direction`|*Direction of the ItemTags*|Axis.horizontal|\n|`verticalDirection`|*Iterate Item from the lower to the upper direction or vice versa*|VerticalDirection.down|\n|`textDirection`|*Text direction of  the ItemTags*|TextDirection.ltr|\n|`itemBuilder`|*tag generator*||\n|`textField`|*add textField*|TagsTextFiled()|\n\n### ItemTags() parameters\n* `index` - *required*\n* `title` - *required*\n* `textScaleFactor` - *custom textScaleFactor*\n* `active` - *bool value (default true)*\n* `pressEnabled` - *active onPress tag ( default true)*\n* `customData` - *Possibility to add any custom value in customData field, you can retrieve this later. A good example: store an id from Firestore document.*\n* `textStyle` - *textStyle()*\n* `alignment` - *MainAxisAlignment ( default MainAxisAlignment.center)*\n* `combine` - * ability to combine text, icons, images in different ways ( default  ItemTagsCombine.imageOrIconOrText)*\n* `icon` - *ItemTagsIcon()*\n* `image` - *ItemTagsImage()*\n* `removeButton` - *ItemTagsRemoveButton()*\n* `borderRadius` - *BorderRadius*\n* `border` - *custom border-side*\n* `padding` - *default EdgeInsets.symmetric(horizontal: 7, vertical: 5)*\n* `elevation` - *default 5*\n* `singleItem` - *default false*\n* `textOverflow` - *default TextOverflow.fade*\n* `textColor` - *default Colors.black*\n* `textActiveColor` - *default  Colors.white*\n* `color` - *default Colors.white*\n* `activeColor` - *default Colors.blueGrey*\n* `highlightColor` - \n* `splashColor` - \n* `colorShowDuplicate` - *default  Colors.red*\n* `onPressed` - *callback*\n* `onLongPressed` - *callback*\n* `onRemoved` - *callback*\n\n\n## Donate\nIt takes time to carry on this project. If you found it useful or learned something from the source code please consider the idea of donating 5, 20, 50 € or whatever you can to support the project.\n- [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/dnag88)\n\n## Issues\nIf you encounter problems, open an issue. Pull request are also welcome.\n"
  },
  {
    "path": "example/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.lock\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# Visual Studio Code related\n.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.packages\n.pub-cache/\n.pub/\nbuild/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": "example/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b\n  channel: beta\n\nproject_type: app\n"
  },
  {
    "path": "example/README.md",
    "content": "# Example Flutter Tags\n\nAn example of how you could implement it.\n\n## Getting Started - Selectable Tags\n```dart\nimport 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nimport 'package:flutter_tags/flutter_tags.dart';\n\nvoid main() => runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Tags Demo',\n      theme: ThemeData(\n        primarySwatch: Colors.blueGrey,\n      ),\n      home: MyHomePage(title: 'Flutter Tags'),\n    );\n  }\n}\n\nclass MyHomePage extends StatefulWidget {\n  MyHomePage({Key key, this.title}) : super(key: key);\n  final String title;\n\n  @override\n  _MyHomePageState createState() => _MyHomePageState();\n}\n\nclass _MyHomePageState extends State<MyHomePage>\n    with SingleTickerProviderStateMixin {\n  TabController _tabController;\n  ScrollController _scrollViewController;\n\n  final List<String> _list = [\n    '0',\n    'SDK',\n    'plugin updates',\n    'Facebook',\n    '哔了狗了QP又不够了',\n    'Kirchhoff',\n    'Italy',\n    'France',\n    'Spain',\n    '美',\n    'Dart',\n    'SDK',\n    'Foo',\n    'Select',\n    'lorem ip',\n    '9',\n    'Star',\n    'Flutter Selectable Tags',\n    '1',\n    'Hubble',\n    '2',\n    'Input flutter tags',\n    'A B C',\n    '8',\n    'Android Studio developer',\n    'welcome to the jungle',\n    'Gauss',\n    '美术',\n    '互联网',\n    '炫舞时代',\n    '篝火营地',\n  ];\n\n  bool _symmetry = false;\n  bool _removeButton = true;\n  bool _singleItem = false;\n  bool _startDirection = false;\n  bool _horizontalScroll = false;\n  bool _withSuggesttions = false;\n  int _count = 0;\n  int _column = 0;\n  double _fontSize = 14;\n\n  String _itemCombine = 'withTextBefore';\n\n  String _onPressed = '';\n\n  List _icon = [Icons.home, Icons.language, Icons.headset];\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(length: 2, vsync: this);\n    _scrollViewController = ScrollController();\n\n    _items = _list.toList();\n  }\n\n  List _items;\n\n  final GlobalKey<TagsState> _tagStateKey = GlobalKey<TagsState>();\n\n  @override\n  Widget build(BuildContext context) {\n    //List<Item> lst = _tagStateKey.currentState?.getAllItem; lst.forEach((f) => print(f.title));\n    return Scaffold(\n      body: NestedScrollView(\n          controller: _scrollViewController,\n          headerSliverBuilder: (BuildContext context, bool boxIsScrolled) {\n            return <Widget>[\n              SliverAppBar(\n                title: Text(\"flutter tags\"),\n                centerTitle: true,\n                pinned: true,\n                expandedHeight: 0,\n                floating: true,\n                forceElevated: boxIsScrolled,\n                bottom: TabBar(\n                  isScrollable: false,\n                  indicatorSize: TabBarIndicatorSize.label,\n                  labelStyle: TextStyle(fontSize: 18.0),\n                  tabs: [\n                    Tab(text: \"Demo 1\"),\n                    Tab(text: \"Demo 2\"),\n                  ],\n                  controller: _tabController,\n                ),\n              )\n            ];\n          },\n          body: TabBarView(\n            controller: _tabController,\n            children: [\n              CustomScrollView(\n                slivers: <Widget>[\n                  SliverList(\n                      delegate: SliverChildListDelegate([\n                    Container(\n                      decoration: BoxDecoration(\n                          border: Border(\n                              bottom: BorderSide(\n                                  color: Colors.grey[300], width: 0.5))),\n                      margin:\n                          EdgeInsets.symmetric(horizontal: 10, vertical: 10),\n                      child: ExpansionTile(\n                        title: Text(\"Settings\"),\n                        children: <Widget>[\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _removeButton,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _removeButton = !_removeButton;\n                                          });\n                                        }),\n                                    Text('Remove Button')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _removeButton = !_removeButton;\n                                  });\n                                },\n                              ),\n                              Padding(\n                                padding: EdgeInsets.all(5),\n                              ),\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _symmetry,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _symmetry = !_symmetry;\n                                          });\n                                        }),\n                                    Text('Symmetry')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _symmetry = !_symmetry;\n                                  });\n                                },\n                              ),\n                              Padding(\n                                padding: EdgeInsets.all(5),\n                              ),\n                              DropdownButton(\n                                hint: _column == 0\n                                    ? Text(\"Not set\")\n                                    : Text(_column.toString()),\n                                items: _buildItems(),\n                                onChanged: (a) {\n                                  setState(() {\n                                    _column = a;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _horizontalScroll,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _horizontalScroll =\n                                                !_horizontalScroll;\n                                          });\n                                        }),\n                                    Text('Horizontal scroll')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _horizontalScroll = !_horizontalScroll;\n                                  });\n                                },\n                              ),\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _singleItem,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _singleItem = !_singleItem;\n                                          });\n                                        }),\n                                    Text('Single Item')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _singleItem = !_singleItem;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Column(\n                            children: <Widget>[\n                              Text('Font Size'),\n                              Row(\n                                mainAxisAlignment: MainAxisAlignment.center,\n                                children: <Widget>[\n                                  Slider(\n                                    value: _fontSize,\n                                    min: 6,\n                                    max: 30,\n                                    onChanged: (a) {\n                                      setState(() {\n                                        _fontSize = (a.round()).toDouble();\n                                      });\n                                    },\n                                  ),\n                                  Text(_fontSize.toString()),\n                                  Padding(\n                                    padding:\n                                        EdgeInsets.symmetric(horizontal: 20),\n                                  ),\n                                  Container(\n                                    height: 30,\n                                    width: 30,\n                                    //color: Colors.blueGrey,\n                                    child: IconButton(\n                                      padding: EdgeInsets.all(0),\n                                      //color: Colors.white,\n                                      icon: Icon(Icons.add),\n                                      onPressed: () {\n                                        setState(() {\n                                          _count++;\n                                          _items.add(_count.toString());\n                                          //_items.removeAt(3); _items.removeAt(10);\n                                        });\n                                      },\n                                    ),\n                                  ),\n                                  Padding(\n                                    padding:\n                                        EdgeInsets.symmetric(horizontal: 5),\n                                  ),\n                                  Container(\n                                    height: 30,\n                                    width: 30,\n                                    //color: Colors.grey,\n                                    child: IconButton(\n                                      padding: EdgeInsets.all(0),\n                                      //color: Colors.white,\n                                      icon: Icon(Icons.refresh),\n                                      onPressed: () {\n                                        setState(() {\n                                          _items = _list.toList();\n                                        });\n                                      },\n                                    ),\n                                  ),\n                                ],\n                              ),\n                            ],\n                          ),\n                        ],\n                      ),\n                    ),\n                    Padding(\n                      padding: EdgeInsets.all(20),\n                    ),\n                    _tags1,\n                    Container(\n                        padding: EdgeInsets.all(20),\n                        child: Column(\n                          children: <Widget>[\n                            Divider(\n                              color: Colors.blueGrey,\n                            ),\n                            Padding(\n                              padding: EdgeInsets.symmetric(vertical: 20),\n                              child: Text(_onPressed),\n                            ),\n                          ],\n                        )),\n                  ])),\n                ],\n              ),\n              CustomScrollView(\n                slivers: <Widget>[\n                  SliverList(\n                      delegate: SliverChildListDelegate([\n                    Container(\n                      decoration: BoxDecoration(\n                          border: Border(\n                              bottom: BorderSide(\n                                  color: Colors.grey[300], width: 0.5))),\n                      margin:\n                          EdgeInsets.symmetric(horizontal: 10, vertical: 10),\n                      child: ExpansionTile(\n                        title: Text(\"Settings\"),\n                        children: <Widget>[\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _withSuggesttions,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _withSuggesttions =\n                                                !_withSuggesttions;\n                                          });\n                                        }),\n                                    Text('Suggestions')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _withSuggesttions = !_withSuggesttions;\n                                  });\n                                },\n                              ),\n                              Padding(\n                                padding: EdgeInsets.all(20),\n                              ),\n                              DropdownButton(\n                                hint: Text(_itemCombine),\n                                items: _buildItems2(),\n                                onChanged: (val) {\n                                  setState(() {\n                                    _itemCombine = val;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _horizontalScroll,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _horizontalScroll =\n                                                !_horizontalScroll;\n                                          });\n                                        }),\n                                    Text('Horizontal scroll')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _horizontalScroll = !_horizontalScroll;\n                                  });\n                                },\n                              ),\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _startDirection,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _startDirection = !_startDirection;\n                                          });\n                                        }),\n                                    Text('Start Direction')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _startDirection = !_startDirection;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Column(\n                            children: <Widget>[\n                              Text('Font Size'),\n                              Row(\n                                mainAxisAlignment: MainAxisAlignment.center,\n                                children: <Widget>[\n                                  Slider(\n                                    value: _fontSize,\n                                    min: 6,\n                                    max: 30,\n                                    onChanged: (a) {\n                                      setState(() {\n                                        _fontSize = (a.round()).toDouble();\n                                      });\n                                    },\n                                  ),\n                                  Text(_fontSize.toString()),\n                                ],\n                              ),\n                            ],\n                          ),\n                        ],\n                      ),\n                    ),\n                    Padding(\n                      padding: EdgeInsets.all(20),\n                    ),\n                    _tags2,\n                    Container(\n                        padding: EdgeInsets.all(20),\n                        child: Column(\n                          children: <Widget>[\n                            Divider(\n                              color: Colors.blueGrey,\n                            ),\n                            Padding(\n                              padding: EdgeInsets.symmetric(vertical: 20),\n                              child: Text(_onPressed),\n                            ),\n                          ],\n                        )),\n                  ])),\n                ],\n              ),\n            ],\n          )),\n    );\n  }\n\n  Widget get _tags1 {\n    return Tags(\n      key: _tagStateKey,\n      symmetry: _symmetry,\n      columns: _column,\n      horizontalScroll: _horizontalScroll,\n      //verticalDirection: VerticalDirection.up, textDirection: TextDirection.rtl,\n      heightHorizontalScroll: 60 * (_fontSize / 14),\n      itemCount: _items.length,\n      itemBuilder: (index) {\n        final item = _items[index];\n\n        return ItemTags(\n          key: Key(index.toString()),\n          index: index,\n          title: item,\n          pressEnabled: true,\n          activeColor: Colors.blueGrey[600],\n          singleItem: _singleItem,\n          splashColor: Colors.green,\n          combine: ItemTagsCombine.withTextBefore,\n          image: index > 0 && index < 5\n              ? ItemTagsImage(\n                  //image: AssetImage(\"img/p$index.jpg\"),\n                  child: Image.network(\n                  \"http://www.clipartpanda.com/clipart_images/user-66327738/download\",\n                  width: 16 * _fontSize / 14,\n                  height: 16 * _fontSize / 14,\n                ))\n              : (1 == 1\n                  ? ItemTagsImage(\n                      image: NetworkImage(\n                          \"https://d32ogoqmya1dw8.cloudfront.net/images/serc/empty_user_icon_256.v2.png\"),\n                    )\n                  : null),\n          icon: (item == '0' || item == '1' || item == '2')\n              ? ItemTagsIcon(\n                  icon: _icon[int.parse(item)],\n                )\n              : null,\n          removeButton: _removeButton\n              ? ItemTagsRemoveButton(\n                  onRemoved: () {\n                    setState(() {\n                      _items.removeAt(index);\n                    });\n                    return true;\n                  },\n                )\n              : null,\n          textScaleFactor:\n              utf8.encode(item.substring(0, 1)).length > 2 ? 0.8 : 1,\n          textStyle: TextStyle(\n            fontSize: _fontSize,\n          ),\n          onPressed: (item) => print(item),\n        );\n      },\n    );\n  }\n\n  // Position for popup menu\n  Offset _tapPosition;\n\n  Widget get _tags2 {\n    //popup Menu\n    final RenderBox overlay = Overlay.of(context).context?.findRenderObject();\n\n    ItemTagsCombine combine = ItemTagsCombine.onlyText;\n\n    switch (_itemCombine) {\n      case 'onlyText':\n        combine = ItemTagsCombine.onlyText;\n        break;\n      case 'onlyIcon':\n        combine = ItemTagsCombine.onlyIcon;\n        break;\n      case 'onlyIcon':\n        combine = ItemTagsCombine.onlyIcon;\n        break;\n      case 'onlyImage':\n        combine = ItemTagsCombine.onlyImage;\n        break;\n      case 'imageOrIconOrText':\n        combine = ItemTagsCombine.imageOrIconOrText;\n        break;\n      case 'withTextAfter':\n        combine = ItemTagsCombine.withTextAfter;\n        break;\n      case 'withTextBefore':\n        combine = ItemTagsCombine.withTextBefore;\n        break;\n    }\n\n    return Tags(\n      key: Key(\"2\"),\n      symmetry: _symmetry,\n      columns: _column,\n      horizontalScroll: _horizontalScroll,\n      verticalDirection:\n          _startDirection ? VerticalDirection.up : VerticalDirection.down,\n      textDirection: _startDirection ? TextDirection.rtl : TextDirection.ltr,\n      heightHorizontalScroll: 60 * (_fontSize / 14),\n      textField: _textField,\n      itemCount: _items.length,\n      itemBuilder: (index) {\n        final item = _items[index];\n\n        return GestureDetector(\n          child: ItemTags(\n            key: Key(index.toString()),\n            index: index,\n            title: item,\n            pressEnabled: false,\n            activeColor: Colors.green[400],\n            combine: combine,\n            image: index > 0 && index < 5\n                ? ItemTagsImage(image: AssetImage(\"img/p$index.jpg\"))\n                : (1 == 1\n                    ? ItemTagsImage(\n                        image: NetworkImage(\n                            \"https://image.flaticon.com/icons/png/512/44/44948.png\"))\n                    : null),\n            icon: (item == '0' || item == '1' || item == '2')\n                ? ItemTagsIcon(\n                    icon: _icon[int.parse(item)],\n                  )\n                : null,\n            removeButton: ItemTagsRemoveButton(\n              backgroundColor: Colors.green[900],\n              onRemoved: () {\n                setState(() {\n                  _items.removeAt(index);\n                });\n                return true;\n              },\n            ),\n            textScaleFactor:\n                utf8.encode(item.substring(0, 1)).length > 2 ? 0.8 : 1,\n            textStyle: TextStyle(\n              fontSize: _fontSize,\n            ),\n          ),\n          onTapDown: (details) => _tapPosition = details.globalPosition,\n          onLongPress: () {\n            showMenu(\n                    //semanticLabel: item,\n                    items: <PopupMenuEntry>[\n                  PopupMenuItem(\n                    child: Text(item, style: TextStyle(color: Colors.blueGrey)),\n                    enabled: false,\n                  ),\n                  PopupMenuDivider(),\n                  PopupMenuItem(\n                    value: 1,\n                    child: Row(\n                      children: <Widget>[\n                        Icon(Icons.content_copy),\n                        Text(\"Copy text\"),\n                      ],\n                    ),\n                  ),\n                ],\n                    context: context,\n                    position: RelativeRect.fromRect(\n                        _tapPosition & Size(40, 40),\n                        Offset.zero &\n                            overlay\n                                .size) // & RelativeRect.fromLTRB(65.0, 40.0, 0.0, 0.0),\n                    )\n                .then((value) {\n              if (value == 1) Clipboard.setData(ClipboardData(text: item));\n            });\n          },\n        );\n      },\n    );\n  }\n\n  TagsTextField get _textField {\n    return TagsTextField(\n      autofocus: false,\n      //width: double.infinity,\n      //padding: EdgeInsets.symmetric(horizontal: 10),\n      textStyle: TextStyle(\n        fontSize: _fontSize,\n        //height: 1\n      ),\n      enabled: true,\n      constraintSuggestion: true,\n      suggestions: _withSuggesttions\n          ? [\n        \"One\",\n        \"two\",\n        \"android\",\n        \"Dart\",\n        \"flutter\",\n        \"test\",\n        \"tests\",\n        \"androids\",\n        \"androidsaaa\",\n        \"Test\",\n        \"suggest\",\n        \"suggestions\",\n        \"互联网\",\n        \"last\",\n        \"lest\",\n        \"炫舞时代\"\n      ]\n          : null,\n      onSubmitted: (String str) {\n        setState(() {\n          _items.add(str);\n        });\n      },\n    );\n  }\n\n  List<DropdownMenuItem> _buildItems() {\n    List<DropdownMenuItem> list = [];\n\n    int count = 19;\n\n    list.add(\n      DropdownMenuItem(\n        child: Text(\"Not set\"),\n        value: 0,\n      ),\n    );\n\n    for (int i = 1; i < count; i++)\n      list.add(\n        DropdownMenuItem(\n          child: Text(i.toString()),\n          value: i,\n        ),\n      );\n\n    return list;\n  }\n\n  List<DropdownMenuItem> _buildItems2() {\n    List<DropdownMenuItem> list = [];\n\n    list.add(DropdownMenuItem(\n      child: Text(\"onlyText\"),\n      value: 'onlyText',\n    ));\n\n    list.add(DropdownMenuItem(\n      child: Text(\"onlyIcon\"),\n      value: 'onlyIcon',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"onlyImage\"),\n      value: 'onlyImage',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"imageOrIconOrText\"),\n      value: 'imageOrIconOrText',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"withTextBefore\"),\n      value: 'withTextBefore',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"withTextAfter\"),\n      value: 'withTextAfter',\n    ));\n\n    return list;\n  }\n}\n```\n\n## DEMO\n![Demo 1](https://github.com/Dn-a/flutter_tags/raw/master/repo-file/img/example0.4.0_1.gif)\n![Demo 1](https://github.com/Dn-a/flutter_tags/raw/master/repo-file/img/example0.4.0_2.gif)\n\n## Other\nThis project is a starting point for a Flutter application.\n\nA few resources to get you started if this is your first Flutter project:\n\n- [Lab: Write your first Flutter app](https://flutter.io/docs/get-started/codelab)\n- [Cookbook: Useful Flutter samples](https://flutter.io/docs/cookbook)\n\nFor help getting started with Flutter, view our \n[online documentation](https://flutter.io/docs), which offers tutorials, \nsamples, guidance on mobile development, and a full API reference.\n"
  },
  {
    "path": "example/ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>8.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Flutter/Debug.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Flutter/Release.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Flutter/flutter_export_environment.sh",
    "content": "#!/bin/sh\n# This is a generated file; do not edit or check into version control.\nexport \"FLUTTER_ROOT=C:\\flutter\"\nexport \"FLUTTER_APPLICATION_PATH=D:\\Android\\Flutter\\package\\flutter_tags\\example\"\nexport \"FLUTTER_TARGET=lib\\main.dart\"\nexport \"FLUTTER_BUILD_DIR=build\"\nexport \"SYMROOT=${SOURCE_ROOT}/../build\\ios\"\nexport \"OTHER_LDFLAGS=$(inherited) -framework Flutter\"\nexport \"FLUTTER_FRAMEWORK_DIR=C:\\flutter\\bin\\cache\\artifacts\\engine\\ios\"\nexport \"FLUTTER_BUILD_NAME=1.0.0\"\nexport \"FLUTTER_BUILD_NUMBER=1\"\nexport \"DART_OBFUSCATION=false\"\nexport \"TRACK_WIDGET_CREATION=false\"\nexport \"TREE_SHAKE_ICONS=false\"\nexport \"PACKAGE_CONFIG=.packages\"\n"
  },
  {
    "path": "example/ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "example/ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>example_flutter_tags</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\""
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };\n\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };\n\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,\n\t\t\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,\n\t\t\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2D5378251FAA1A9400D5DBA9 /* flutter_assets */,\n\t\t\t\t3B80C3931E831B6300D905FE /* App.framework */,\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0910;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 0910;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = S8QB4VV633;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.dna.exampleFlutterTags;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.dna.exampleFlutterTags;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.dna.exampleFlutterTags;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0910\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/lib/main.dart",
    "content": "import 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nimport 'package:flutter_tags/flutter_tags.dart';\n\nvoid main() => runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Tags Demo',\n      theme: ThemeData(\n        primarySwatch: Colors.blueGrey,\n      ),\n      home: MyHomePage(title: 'Flutter Tags'),\n    );\n  }\n}\n\nclass MyHomePage extends StatefulWidget {\n  MyHomePage({Key key, this.title}) : super(key: key);\n  final String title;\n\n  @override\n  _MyHomePageState createState() => _MyHomePageState();\n}\n\nclass _MyHomePageState extends State<MyHomePage>\n    with SingleTickerProviderStateMixin {\n  TabController _tabController;\n  ScrollController _scrollViewController;\n\n  final List<String> _list = [\n    '0',\n    'SDK',\n    'plugin updates',\n    'Facebook',\n    '哔了狗了QP又不够了',\n    'Kirchhoff',\n    'Italy',\n    'France',\n    'Spain',\n    '美',\n    'Dart',\n    'SDK',\n    'Foo',\n    'Select',\n    'lorem ip',\n    '9',\n    'Star',\n    'Flutter Selectable Tags',\n    '1',\n    'Hubble',\n    '2',\n    'Input flutter tags',\n    'A B C',\n    '8',\n    'Android Studio developer',\n    'welcome to the jungle',\n    'Gauss',\n    '美术',\n    '互联网',\n    '炫舞时代',\n    '篝火营地',\n  ];\n\n  bool _symmetry = false;\n  bool _removeButton = true;\n  bool _singleItem = true;\n  bool _startDirection = false;\n  bool _horizontalScroll = true;\n  bool _withSuggesttions = false;\n  int _count = 0;\n  int _column = 0;\n  double _fontSize = 14;\n\n  String _itemCombine = 'withTextBefore';\n\n  String _onPressed = '';\n\n  List _icon = [Icons.home, Icons.language, Icons.headset];\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(length: 2, vsync: this);\n    _scrollViewController = ScrollController();\n\n    _items = _list.toList();\n  }\n\n  List _items;\n\n  final GlobalKey<TagsState> _tagStateKey = GlobalKey<TagsState>();\n\n  @override\n  Widget build(BuildContext context) {\n    //List<Item> lst = _tagStateKey.currentState?.getAllItem; lst.forEach((f) => print(f.title));\n    return Scaffold(\n      body: NestedScrollView(\n          controller: _scrollViewController,\n          headerSliverBuilder: (BuildContext context, bool boxIsScrolled) {\n            return <Widget>[\n              SliverAppBar(\n                title: Text(\"flutter tags\"),\n                centerTitle: true,\n                pinned: true,\n                expandedHeight: 0,\n                floating: true,\n                forceElevated: boxIsScrolled,\n                bottom: TabBar(\n                  isScrollable: false,\n                  indicatorSize: TabBarIndicatorSize.label,\n                  labelStyle: TextStyle(fontSize: 18.0),\n                  tabs: [\n                    Tab(text: \"Demo 1\"),\n                    Tab(text: \"Demo 2\"),\n                  ],\n                  controller: _tabController,\n                ),\n              )\n            ];\n          },\n          body: TabBarView(\n            controller: _tabController,\n            children: [\n              CustomScrollView(\n                slivers: <Widget>[\n                  SliverList(\n                      delegate: SliverChildListDelegate([\n                    Container(\n                      decoration: BoxDecoration(\n                          border: Border(\n                              bottom: BorderSide(\n                                  color: Colors.grey[300], width: 0.5))),\n                      margin:\n                          EdgeInsets.symmetric(horizontal: 10, vertical: 10),\n                      child: ExpansionTile(\n                        title: Text(\"Settings\"),\n                        children: <Widget>[\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _removeButton,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _removeButton = !_removeButton;\n                                          });\n                                        }),\n                                    Text('Remove Button')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _removeButton = !_removeButton;\n                                  });\n                                },\n                              ),\n                              Padding(\n                                padding: EdgeInsets.all(5),\n                              ),\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _symmetry,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _symmetry = !_symmetry;\n                                          });\n                                        }),\n                                    Text('Symmetry')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _symmetry = !_symmetry;\n                                  });\n                                },\n                              ),\n                              Padding(\n                                padding: EdgeInsets.all(5),\n                              ),\n                              DropdownButton(\n                                hint: _column == 0\n                                    ? Text(\"Not set\")\n                                    : Text(_column.toString()),\n                                items: _buildItems(),\n                                onChanged: (a) {\n                                  setState(() {\n                                    _column = a;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _horizontalScroll,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _horizontalScroll =\n                                                !_horizontalScroll;\n                                          });\n                                        }),\n                                    Text('Horizontal scroll')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _horizontalScroll = !_horizontalScroll;\n                                  });\n                                },\n                              ),\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _singleItem,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _singleItem = !_singleItem;\n                                          });\n                                        }),\n                                    Text('Single Item')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _singleItem = !_singleItem;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Column(\n                            children: <Widget>[\n                              Text('Font Size'),\n                              Row(\n                                mainAxisAlignment: MainAxisAlignment.center,\n                                children: <Widget>[\n                                  Slider(\n                                    value: _fontSize,\n                                    min: 6,\n                                    max: 30,\n                                    onChanged: (a) {\n                                      setState(() {\n                                        _fontSize = (a.round()).toDouble();\n                                      });\n                                    },\n                                  ),\n                                  Text(_fontSize.toString()),\n                                  Padding(\n                                    padding:\n                                        EdgeInsets.symmetric(horizontal: 20),\n                                  ),\n                                  Container(\n                                    height: 30,\n                                    width: 30,\n                                    //color: Colors.blueGrey,\n                                    child: IconButton(\n                                      padding: EdgeInsets.all(0),\n                                      //color: Colors.white,\n                                      icon: Icon(Icons.add),\n                                      onPressed: () {\n                                        setState(() {\n                                          _count++;\n                                          _items.add(_count.toString());\n                                          //_items.removeAt(3); _items.removeAt(10);\n                                        });\n                                      },\n                                    ),\n                                  ),\n                                  Padding(\n                                    padding:\n                                        EdgeInsets.symmetric(horizontal: 5),\n                                  ),\n                                  Container(\n                                    height: 30,\n                                    width: 30,\n                                    //color: Colors.grey,\n                                    child: IconButton(\n                                      padding: EdgeInsets.all(0),\n                                      //color: Colors.white,\n                                      icon: Icon(Icons.refresh),\n                                      onPressed: () {\n                                        setState(() {\n                                          _items = _list.toList();\n                                        });\n                                      },\n                                    ),\n                                  ),\n                                ],\n                              ),\n                            ],\n                          ),\n                        ],\n                      ),\n                    ),\n                    Padding(\n                      padding: EdgeInsets.all(20),\n                    ),\n                    _tags1,\n                    Container(\n                        padding: EdgeInsets.all(20),\n                        child: Column(\n                          children: <Widget>[\n                            Divider(\n                              color: Colors.blueGrey,\n                            ),\n                            Padding(\n                              padding: EdgeInsets.symmetric(vertical: 20),\n                              child: Text(_onPressed),\n                            ),\n                          ],\n                        )),\n                  ])),\n                ],\n              ),\n              CustomScrollView(\n                slivers: <Widget>[\n                  SliverList(\n                      delegate: SliverChildListDelegate([\n                    Container(\n                      decoration: BoxDecoration(\n                          border: Border(\n                              bottom: BorderSide(\n                                  color: Colors.grey[300], width: 0.5))),\n                      margin:\n                          EdgeInsets.symmetric(horizontal: 10, vertical: 10),\n                      child: ExpansionTile(\n                        title: Text(\"Settings\"),\n                        children: <Widget>[\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _withSuggesttions,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _withSuggesttions =\n                                                !_withSuggesttions;\n                                          });\n                                        }),\n                                    Text('Suggestions')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _withSuggesttions = !_withSuggesttions;\n                                  });\n                                },\n                              ),\n                              Padding(\n                                padding: EdgeInsets.all(20),\n                              ),\n                              DropdownButton(\n                                hint: Text(_itemCombine),\n                                items: _buildItems2(),\n                                onChanged: (val) {\n                                  setState(() {\n                                    _itemCombine = val;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            children: <Widget>[\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _horizontalScroll,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _horizontalScroll =\n                                                !_horizontalScroll;\n                                          });\n                                        }),\n                                    Text('Horizontal scroll')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _horizontalScroll = !_horizontalScroll;\n                                  });\n                                },\n                              ),\n                              GestureDetector(\n                                child: Row(\n                                  children: <Widget>[\n                                    Checkbox(\n                                        value: _startDirection,\n                                        onChanged: (a) {\n                                          setState(() {\n                                            _startDirection = !_startDirection;\n                                          });\n                                        }),\n                                    Text('Start Direction')\n                                  ],\n                                ),\n                                onTap: () {\n                                  setState(() {\n                                    _startDirection = !_startDirection;\n                                  });\n                                },\n                              ),\n                            ],\n                          ),\n                          Column(\n                            children: <Widget>[\n                              Text('Font Size'),\n                              Row(\n                                mainAxisAlignment: MainAxisAlignment.center,\n                                children: <Widget>[\n                                  Slider(\n                                    value: _fontSize,\n                                    min: 6,\n                                    max: 30,\n                                    onChanged: (a) {\n                                      setState(() {\n                                        _fontSize = (a.round()).toDouble();\n                                      });\n                                    },\n                                  ),\n                                  Text(_fontSize.toString()),\n                                ],\n                              ),\n                            ],\n                          ),\n                        ],\n                      ),\n                    ),\n                    Padding(\n                      padding: EdgeInsets.all(20),\n                    ),\n                    _tags2,\n                    Container(\n                        padding: EdgeInsets.all(20),\n                        child: Column(\n                          children: <Widget>[\n                            Divider(\n                              color: Colors.blueGrey,\n                            ),\n                            Padding(\n                              padding: EdgeInsets.symmetric(vertical: 20),\n                              child: Text(_onPressed),\n                            ),\n                          ],\n                        )),\n                  ])),\n                ],\n              ),\n            ],\n          )),\n    );\n  }\n\n  Widget get _tags1 {\n    return Tags(\n      key: _tagStateKey,\n      symmetry: _symmetry,\n      columns: _column,\n      horizontalScroll: _horizontalScroll,\n      //verticalDirection: VerticalDirection.up, textDirection: TextDirection.rtl,\n      heightHorizontalScroll: 60 * (_fontSize / 14),\n      itemCount: _items.length,\n      itemBuilder: (index) {\n        final item = _items[index];\n\n        return ItemTags(\n          key: Key(index.toString()),\n          index: index,\n          title: item,\n          pressEnabled: true,\n          activeColor: Colors.blueGrey[600],\n          singleItem: _singleItem,\n          splashColor: Colors.green,\n          combine: ItemTagsCombine.withTextBefore,\n          image: index > 0 && index < 5\n              ? ItemTagsImage(\n                  //image: AssetImage(\"img/p$index.jpg\"),\n                  child: Image.network(\n                  \"http://www.clipartpanda.com/clipart_images/user-66327738/download\",\n                  width: 16 * _fontSize / 14,\n                  height: 16 * _fontSize / 14,\n                ))\n              : (1 == 1\n                  ? ItemTagsImage(\n                      image: NetworkImage(\n                          \"https://d32ogoqmya1dw8.cloudfront.net/images/serc/empty_user_icon_256.v2.png\"),\n                    )\n                  : null),\n          icon: (item == '0' || item == '1' || item == '2')\n              ? ItemTagsIcon(\n                  icon: _icon[int.parse(item)],\n                )\n              : null,\n          removeButton: _removeButton\n              ? ItemTagsRemoveButton(\n                  onRemoved: () {\n                    setState(() {\n                      _items.removeAt(index);\n                    });\n                    return true;\n                  },\n                )\n              : null,\n          textScaleFactor:\n              utf8.encode(item.substring(0, 1)).length > 2 ? 0.8 : 1,\n          textStyle: TextStyle(\n            fontSize: _fontSize,\n          ),\n          onPressed: (item) => print(item),\n        );\n      },\n    );\n  }\n\n  // Position for popup menu\n  Offset _tapPosition;\n\n  Widget get _tags2 {\n    //popup Menu\n    final RenderBox overlay = Overlay.of(context).context?.findRenderObject();\n\n    ItemTagsCombine combine = ItemTagsCombine.onlyText;\n\n    switch (_itemCombine) {\n      case 'onlyText':\n        combine = ItemTagsCombine.onlyText;\n        break;\n      case 'onlyIcon':\n        combine = ItemTagsCombine.onlyIcon;\n        break;\n      case 'onlyIcon':\n        combine = ItemTagsCombine.onlyIcon;\n        break;\n      case 'onlyImage':\n        combine = ItemTagsCombine.onlyImage;\n        break;\n      case 'imageOrIconOrText':\n        combine = ItemTagsCombine.imageOrIconOrText;\n        break;\n      case 'withTextAfter':\n        combine = ItemTagsCombine.withTextAfter;\n        break;\n      case 'withTextBefore':\n        combine = ItemTagsCombine.withTextBefore;\n        break;\n    }\n\n    return Tags(\n      key: Key(\"2\"),\n      symmetry: _symmetry,\n      columns: _column,\n      horizontalScroll: _horizontalScroll,\n      verticalDirection:\n          _startDirection ? VerticalDirection.up : VerticalDirection.down,\n      textDirection: _startDirection ? TextDirection.rtl : TextDirection.ltr,\n      heightHorizontalScroll: 60 * (_fontSize / 14),\n      textField: _textField,\n      itemCount: _items.length,\n      itemBuilder: (index) {\n        final item = _items[index];\n\n        return GestureDetector(\n          child: ItemTags(\n            key: Key(index.toString()),\n            index: index,\n            title: item,\n            pressEnabled: false,\n            activeColor: Colors.green[400],\n            combine: combine,\n            image: index > 0 && index < 5\n                ? ItemTagsImage(image: AssetImage(\"img/p$index.jpg\"))\n                : (1 == 1\n                    ? ItemTagsImage(\n                        image: NetworkImage(\n                            \"https://image.flaticon.com/icons/png/512/44/44948.png\"))\n                    : null),\n            icon: (item == '0' || item == '1' || item == '2')\n                ? ItemTagsIcon(\n                    icon: _icon[int.parse(item)],\n                  )\n                : null,\n            removeButton: ItemTagsRemoveButton(\n              backgroundColor: Colors.green[900],\n              onRemoved: () {\n                setState(() {\n                  _items.removeAt(index);\n                });\n                return true;\n              },\n            ),\n            textScaleFactor:\n                utf8.encode(item.substring(0, 1)).length > 2 ? 0.8 : 1,\n            textStyle: TextStyle(\n              fontSize: _fontSize,\n            ),\n          ),\n          onTapDown: (details) => _tapPosition = details.globalPosition,\n          onLongPress: () {\n            showMenu(\n                    //semanticLabel: item,\n                    items: <PopupMenuEntry>[\n                  PopupMenuItem(\n                    child: Text(item, style: TextStyle(color: Colors.blueGrey)),\n                    enabled: false,\n                  ),\n                  PopupMenuDivider(),\n                  PopupMenuItem(\n                    value: 1,\n                    child: Row(\n                      children: <Widget>[\n                        Icon(Icons.content_copy),\n                        Text(\"Copy text\"),\n                      ],\n                    ),\n                  ),\n                ],\n                    context: context,\n                    position: RelativeRect.fromRect(\n                        _tapPosition & Size(40, 40),\n                        Offset.zero &\n                            overlay\n                                .size) // & RelativeRect.fromLTRB(65.0, 40.0, 0.0, 0.0),\n                    )\n                .then((value) {\n              if (value == 1) Clipboard.setData(ClipboardData(text: item));\n            });\n          },\n        );\n      },\n    );\n  }\n\n  TagsTextField get _textField {\n    return TagsTextField(\n      autofocus: false,\n      width: double.infinity,\n      padding: EdgeInsets.symmetric(horizontal: 10),\n      textStyle: TextStyle(\n        fontSize: _fontSize,\n        //height: 1\n      ),\n      enabled: true,\n      constraintSuggestion: true,\n      suggestions: _withSuggesttions\n          ? [\n              \"One\",\n              \"two\",\n              \"android\",\n              \"Dart\",\n              \"flutter\",\n              \"test\",\n              \"tests\",\n              \"androids\",\n              \"androidsaaa\",\n              \"Test\",\n              \"suggest\",\n              \"suggestions\",\n              \"互联网\",\n              \"last\",\n              \"lest\",\n              \"炫舞时代\"\n            ]\n          : null,\n      onSubmitted: (String str) {\n        setState(() {\n          _items.add(str);\n        });\n      },\n    );\n  }\n\n  List<DropdownMenuItem> _buildItems() {\n    List<DropdownMenuItem> list = [];\n\n    int count = 19;\n\n    list.add(\n      DropdownMenuItem(\n        child: Text(\"Not set\"),\n        value: 0,\n      ),\n    );\n\n    for (int i = 1; i < count; i++)\n      list.add(\n        DropdownMenuItem(\n          child: Text(i.toString()),\n          value: i,\n        ),\n      );\n\n    return list;\n  }\n\n  List<DropdownMenuItem> _buildItems2() {\n    List<DropdownMenuItem> list = [];\n\n    list.add(DropdownMenuItem(\n      child: Text(\"onlyText\"),\n      value: 'onlyText',\n    ));\n\n    list.add(DropdownMenuItem(\n      child: Text(\"onlyIcon\"),\n      value: 'onlyIcon',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"onlyImage\"),\n      value: 'onlyImage',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"imageOrIconOrText\"),\n      value: 'imageOrIconOrText',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"withTextBefore\"),\n      value: 'withTextBefore',\n    ));\n    list.add(DropdownMenuItem(\n      child: Text(\"withTextAfter\"),\n      value: 'withTextAfter',\n    ));\n\n    return list;\n  }\n}\n"
  },
  {
    "path": "example/pubspec.yaml",
    "content": "name: example_flutter_tags\ndescription: A new Flutter application.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# Read more about versioning at semver.org.\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.0.0-dev.68.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_tags:\n    path: ../\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons: ^0.1.2\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  # To add assets to your application, add an assets section, like this:\n  assets:\n    - img/p1.jpg\n    - img/p2.jpg\n    - img/p3.jpg\n    - img/p4.jpg\n\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.io/assets-and-images/#resolution-aware.\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.io/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.io/custom-fonts/#from-packages\n"
  },
  {
    "path": "example/test/widget_test.dart",
    "content": "import 'package:flutter/material.dart';\n\nvoid main() {}\n"
  },
  {
    "path": "flutter_tags.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"android\" name=\"Android\">\n      <configuration>\n        <option name=\"ALLOW_USER_CONFIGURATION\" value=\"false\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/lib\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/test\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/gen\" isTestSource=\"false\" generated=\"true\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.dart_tool\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.idea\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.pub\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/.dart_tool\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/.pub\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/build\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/example_flutter_tags/.dart_tool\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/example_flutter_tags/.pub\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/example_flutter_tags/build\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Android API 25 Platform\" jdkType=\"Android SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" name=\"Dart SDK\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Flutter Plugins\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Dart Packages\" level=\"project\" />\n  </component>\n</module>"
  },
  {
    "path": "lib/flutter_tags.dart",
    "content": "library flutter_tags;\n\nexport 'src/suggestions_textfield.dart';\nexport 'src/item_tags.dart';\nexport 'src/tags.dart';\n"
  },
  {
    "path": "lib/src/item_tags.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_tags/src/tags.dart';\n\n/// Used by [ItemTags.onPressed].\ntypedef OnPressedCallback = void Function(Item i);\n\n/// Used by [ItemTags.OnLongPressed].\ntypedef OnLongPressedCallback = void Function(Item i);\n\n/// Used by [ItemTags.removeButton.onRemoved].\ntypedef OnRemovedCallback = bool Function();\n\n/// combines icon text or image\nenum ItemTagsCombine {\n  onlyText,\n  onlyIcon,\n  onlyImage,\n  imageOrIconOrText,\n  withTextBefore,\n  withTextAfter\n}\n\nclass ItemTags extends StatefulWidget {\n  ItemTags(\n      {@required this.index,\n      @required this.title,\n      this.textScaleFactor,\n      this.active = true,\n      this.pressEnabled = true,\n      this.customData,\n      this.textStyle = const TextStyle(fontSize: 14),\n      this.alignment = MainAxisAlignment.center,\n      this.combine = ItemTagsCombine.imageOrIconOrText,\n      this.icon,\n      this.image,\n      this.removeButton,\n      this.borderRadius,\n      this.border,\n      this.padding = const EdgeInsets.symmetric(horizontal: 7, vertical: 5),\n      this.elevation = 5,\n      this.singleItem = false,\n      this.textOverflow = TextOverflow.fade,\n      this.textColor = Colors.black,\n      this.textActiveColor = Colors.white,\n      this.color = Colors.white,\n      this.activeColor = Colors.blueGrey,\n      this.highlightColor,\n      this.splashColor,\n      this.colorShowDuplicate = Colors.red,\n      this.onPressed,\n      this.onLongPressed,\n      Key key})\n      : assert(index != null),\n        assert(title != null),\n        super(key: key);\n\n  /// Id of [ItemTags] - required\n  final int index;\n\n  /// Title of [ItemTags] - required\n  final String title;\n\n  /// Scale Factor of [ItemTags] - double\n  final double textScaleFactor;\n\n  /// Initial bool value\n  final bool active;\n\n  /// Initial bool value\n  final bool pressEnabled;\n\n  /// Possibility to add any custom value in customData field, you can retrieve this later. A good example: store an id from Firestore document.\n  final dynamic customData;\n\n  /// ItemTagsCombine (text,icon,textIcon,textImage) of [ItemTags]\n  final ItemTagsCombine combine;\n\n  /// Icon of [ItemTags]\n  final ItemTagsIcon icon;\n\n  /// Image of [ItemTags]\n  final ItemTagsImage image;\n\n  /// Custom Remove Button of [ItemTags]\n  final ItemTagsRemoveButton removeButton;\n\n  /// TextStyle of the [ItemTags]\n  final TextStyle textStyle;\n\n  /// TextStyle of the [ItemTags]\n  final MainAxisAlignment alignment;\n\n  /// border-radius of [ItemTags]\n  final BorderRadius borderRadius;\n\n  /// custom border-side of [ItemTags]\n  final BoxBorder border;\n\n  /// padding of the [ItemTags]\n  final EdgeInsets padding;\n\n  /// BoxShadow of the [ItemTags]\n  final double elevation;\n\n  /// when you want only one tag selected. same radio-button\n  final bool singleItem;\n\n  /// type of text overflow within the [ItemTags]\n  final TextOverflow textOverflow;\n\n  /// text color of the [ItemTags]\n  final Color textColor;\n\n  /// color of the [ItemTags] text activated\n  final Color textActiveColor;\n\n  /// background color [ItemTags]\n  final Color color;\n\n  /// background color [ItemTags] activated\n  final Color activeColor;\n\n  /// highlight Color [ItemTags]\n  final Color highlightColor;\n\n  /// Splash color [ItemTags]\n  final Color splashColor;\n\n  /// Color show duplicate [ItemTags]\n  final Color colorShowDuplicate;\n\n  /// callback\n  final OnPressedCallback onPressed;\n\n  /// callback\n  final OnLongPressedCallback onLongPressed;\n\n  @override\n  _ItemTagsState createState() => _ItemTagsState();\n}\n\nclass _ItemTagsState extends State<ItemTags> {\n  final double _initBorderRadius = 50;\n\n  DataListInherited _dataListInherited;\n  DataList _dataList;\n\n  void _setDataList() {\n    // Get List<DataList> from Tags widget\n    _dataListInherited = DataListInherited.of(context);\n\n    // set List length\n    if (_dataListInherited.list.length < _dataListInherited.itemCount)\n      _dataListInherited.list.length = _dataListInherited.itemCount;\n\n    if (_dataListInherited.list.length > (widget.index + 1) &&\n        _dataListInherited.list.elementAt(widget.index) != null &&\n        _dataListInherited.list.elementAt(widget.index).title != widget.title) {\n      // when an element is removed from the data source\n      _dataListInherited.list.removeAt(widget.index);\n\n      // when all item list changed in data source\n      if (_dataListInherited.list.elementAt(widget.index) != null &&\n          _dataListInherited.list.elementAt(widget.index).title != widget.title)\n        _dataListInherited.list\n            .removeRange(widget.index, _dataListInherited.list.length);\n    }\n\n    // add new Item in the List\n    if (_dataListInherited.list.length < (widget.index + 1)) {\n      //print(\"add\");\n      _dataListInherited.list.insert(\n          widget.index,\n          DataList(\n              title: widget.title,\n              index: widget.index,\n              active: widget.singleItem ? false : widget.active,\n              customData: widget.customData));\n    } else if (_dataListInherited.list.elementAt(widget.index) == null) {\n      //print(\"replace\");\n      _dataListInherited.list[widget.index] = DataList(\n          title: widget.title,\n          index: widget.index,\n          active: widget.singleItem ? false : widget.active,\n          customData: widget.customData);\n    }\n\n    // removes items that have been orphaned\n    if (_dataListInherited.itemCount == widget.index + 1 &&\n        _dataListInherited.list.length > _dataListInherited.itemCount)\n      _dataListInherited.list\n          .removeRange(widget.index + 1, _dataListInherited.list.length);\n\n    //print(_dataListInherited.list.length);\n\n    // update Listener\n    if (_dataList != null) _dataList.removeListener(_didValueChange);\n\n    _dataList = _dataListInherited.list.elementAt(widget.index);\n    _dataList.addListener(_didValueChange);\n  }\n\n  _didValueChange() => setState(() {});\n\n  @override\n  void dispose() {\n    _dataList.removeListener(_didValueChange);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    _setDataList();\n\n    final double fontSize = widget.textStyle.fontSize;\n\n    Color color = _dataList.active ? widget.activeColor : widget.color;\n\n    if (_dataList.showDuplicate) color = widget.colorShowDuplicate;\n\n    return Material(\n      color: color,\n      borderRadius:\n          widget.borderRadius ?? BorderRadius.circular(_initBorderRadius),\n      elevation: widget.elevation,\n      //shadowColor: _dataList.highlights? Colors.red : Colors.blue,\n      child: InkWell(\n        borderRadius:\n            widget.borderRadius ?? BorderRadius.circular(_initBorderRadius),\n        highlightColor:\n            widget.pressEnabled ? widget.highlightColor : Colors.transparent,\n        splashColor:\n            widget.pressEnabled ? widget.splashColor : Colors.transparent,\n        child: Container(\n            decoration: BoxDecoration(\n                border: widget.border ??\n                    Border.all(color: widget.activeColor, width: 0.5),\n                borderRadius: widget.borderRadius ??\n                    BorderRadius.circular(_initBorderRadius)),\n            padding: widget.padding * (fontSize / 14),\n            child: _combine),\n        onTap: widget.pressEnabled\n            ? () {\n                if (widget.singleItem) {\n                  _singleItem(_dataListInherited, _dataList);\n                  _dataList.active = true;\n                } else\n                  _dataList.active = !_dataList.active;\n\n                if (widget.onPressed != null)\n                  widget.onPressed(Item(\n                      index: widget.index,\n                      title: _dataList.title,\n                      active: _dataList.active,\n                      customData: widget.customData));\n              }\n            : null,\n        onLongPress: widget.onLongPressed != null\n            ? () => widget.onLongPressed(Item(\n                index: widget.index,\n                title: _dataList.title,\n                active: _dataList.active,\n                customData: widget.customData))\n            : null,\n      ),\n    );\n  }\n\n  Widget get _combine {\n    if (widget.image != null)\n      assert((widget.image.image != null && widget.image.child == null) ||\n          (widget.image.child != null && widget.image.image == null));\n    final Widget text = Text(\n      widget.title,\n      softWrap: false,\n      textAlign: _textAlignment,\n      overflow: widget.textOverflow,\n      textScaleFactor: widget.textScaleFactor,\n      style: _textStyle,\n    );\n    final Widget icon = widget.icon != null\n        ? Container(\n            padding: widget.icon.padding ??\n                (widget.combine == ItemTagsCombine.onlyIcon ||\n                        widget.combine == ItemTagsCombine.imageOrIconOrText\n                    ? null\n                    : widget.combine == ItemTagsCombine.withTextAfter\n                        ? EdgeInsets.only(right: 5)\n                        : EdgeInsets.only(left: 5)),\n            child: Icon(\n              widget.icon.icon,\n              color: _textStyle.color,\n              size: _textStyle.fontSize * 1.2,\n            ),\n          )\n        : text;\n    final Widget image = widget.image != null\n        ? Container(\n            padding: widget.image.padding ??\n                (widget.combine == ItemTagsCombine.onlyImage ||\n                        widget.combine == ItemTagsCombine.imageOrIconOrText\n                    ? null\n                    : widget.combine == ItemTagsCombine.withTextAfter\n                        ? EdgeInsets.only(right: 5)\n                        : EdgeInsets.only(left: 5)),\n            child: widget.image.child ??\n                CircleAvatar(\n                  radius:\n                      widget.image.radius * (widget.textStyle.fontSize / 14),\n                  backgroundColor: Colors.transparent,\n                  backgroundImage: widget.image.image,\n                ),\n          )\n        : text;\n\n    final List list = List();\n\n    switch (widget.combine) {\n      case ItemTagsCombine.onlyText:\n        list.add(text);\n        break;\n      case ItemTagsCombine.onlyIcon:\n        list.add(icon);\n        break;\n      case ItemTagsCombine.onlyImage:\n        list.add(image);\n        break;\n      case ItemTagsCombine.imageOrIconOrText:\n        list.add((image != text ? image : icon));\n        break;\n      case ItemTagsCombine.withTextBefore:\n        list.add(text);\n        if (image != text)\n          list.add(image);\n        else if (icon != text) list.add(icon);\n        break;\n      case ItemTagsCombine.withTextAfter:\n        if (image != text)\n          list.add(image);\n        else if (icon != text) list.add(icon);\n        list.add(text);\n    }\n\n    final Widget row = Row(\n        mainAxisAlignment: widget.alignment,\n        mainAxisSize: MainAxisSize.min,\n        children: List.generate(list.length, (i) {\n          if (i == 0 && list.length > 1)\n            return Flexible(\n              flex: widget.combine == ItemTagsCombine.withTextAfter ? 0 : 1,\n              child: list[i],\n            );\n          return Flexible(\n            flex: widget.combine == ItemTagsCombine.withTextAfter ||\n                    list.length == 1\n                ? 1\n                : 0,\n            child: list[i],\n          );\n        }));\n\n    if (widget.removeButton != null)\n      return Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          mainAxisSize: MainAxisSize.min,\n          children: <Widget>[\n            Flexible(\n                fit:\n                    _dataListInherited.symmetry ? FlexFit.tight : FlexFit.loose,\n                flex: 2,\n                child: row),\n            Flexible(\n                flex: 0,\n                child: FittedBox(\n                    alignment: Alignment.centerRight,\n                    fit: BoxFit.fill,\n                    child: GestureDetector(\n                      child: Container(\n                        margin: widget.removeButton.margin ??\n                            EdgeInsets.only(left: 5),\n                        padding:\n                            (widget.removeButton.padding ?? EdgeInsets.all(2)) *\n                                (widget.textStyle.fontSize / 14),\n                        decoration: BoxDecoration(\n                          color: widget.removeButton.backgroundColor ??\n                              Colors.black,\n                          borderRadius: widget.removeButton.borderRadius ??\n                              BorderRadius.circular(_initBorderRadius),\n                        ),\n                        child: widget.removeButton.padding ??\n                            Icon(\n                              Icons.clear,\n                              color: widget.removeButton.color ?? Colors.white,\n                              size: (widget.removeButton.size ?? 12) *\n                                  (widget.textStyle.fontSize / 14),\n                            ),\n                      ),\n                      onTap: () {\n                        if (widget.removeButton.onRemoved != null) {\n                          if (widget.removeButton.onRemoved())\n                            _dataListInherited.list.removeAt(widget.index);\n                        }\n                      },\n                    )))\n          ]);\n\n    return row;\n  }\n\n  ///Text Alignment\n  TextAlign get _textAlignment {\n    switch (widget.alignment) {\n      case MainAxisAlignment.spaceBetween:\n      case MainAxisAlignment.start:\n        return TextAlign.start;\n        break;\n      case MainAxisAlignment.end:\n        return TextAlign.end;\n        break;\n      case MainAxisAlignment.spaceAround:\n      case MainAxisAlignment.spaceEvenly:\n      case MainAxisAlignment.center:\n        return TextAlign.center;\n    }\n    return null;\n  }\n\n  ///TextStyle\n  TextStyle get _textStyle {\n    return widget.textStyle.apply(\n      color: _dataList.active ? widget.textActiveColor : widget.textColor,\n    );\n  }\n\n  /// Single item selection\n  void _singleItem(DataListInherited dataSetIn, DataList dataSet) {\n    dataSetIn.list\n        .where((tg) => tg != null)\n        .where((tg) => tg.active)\n        .where((tg2) => tg2 != dataSet)\n        .forEach((tg) => tg.active = false);\n  }\n}\n\n///callback\nclass Item {\n  Item({this.index, this.title, this.active, this.customData});\n  final int index;\n  final String title;\n  final bool active;\n  final dynamic customData;\n\n  @override\n  String toString() {\n    return \"id:$index, title: $title, active: $active, customData: $customData\";\n  }\n}\n\n/// ItemTag Image\nclass ItemTagsImage {\n  ItemTagsImage({this.radius = 8, this.padding, this.image, this.child});\n\n  final double radius;\n  final EdgeInsets padding;\n  final ImageProvider image;\n  final Widget child;\n}\n\n/// ItemTag Icon\nclass ItemTagsIcon {\n  ItemTagsIcon({this.padding, @required this.icon});\n\n  final EdgeInsets padding;\n  final IconData icon;\n}\n\n/// ItemTag RemoveButton\nclass ItemTagsRemoveButton {\n  ItemTagsRemoveButton(\n      {this.icon,\n      this.size,\n      this.backgroundColor,\n      this.color,\n      this.borderRadius,\n      this.padding,\n      this.margin,\n      this.onRemoved});\n\n  final IconData icon;\n  final double size;\n  final Color backgroundColor;\n  final Color color;\n  final BorderRadius borderRadius;\n  final EdgeInsets padding;\n  final EdgeInsets margin;\n\n  /// callback\n  final OnRemovedCallback onRemoved;\n}\n"
  },
  {
    "path": "lib/src/suggestions_textfield.dart",
    "content": "import 'package:flutter/material.dart';\n\n// InputSuggestions version 0.0.1\n// currently yield inline suggestions\n// I will soon implement a list with suggestions\n// Credit Dn-a -> https://github.com/Dn-a\n\n/// Used by [SuggestionsTextField.onChanged].\ntypedef OnChangedCallback = void Function(String string);\n\n/// Used by [SuggestionsTextField.onSubmitted].\ntypedef OnSubmittedCallback = void Function(String string);\n\nclass SuggestionsTextField extends StatefulWidget {\n  SuggestionsTextField(\n      {@required this.tagsTextField, this.onSubmitted, Key key})\n      : assert(tagsTextField != null),\n        super(key: key);\n\n  final TagsTextField tagsTextField;\n  final OnSubmittedCallback onSubmitted;\n\n  @override\n  _SuggestionsTextFieldState createState() => _SuggestionsTextFieldState();\n}\n\nclass _SuggestionsTextFieldState extends State<SuggestionsTextField> {\n  final _controller = TextEditingController();\n\n  List<String> _matches = List();\n  String _helperText;\n  bool _helperCheck = true;\n\n  List<String> _suggestions;\n  bool _constraintSuggestion;\n  double _fontSize;\n  InputDecoration _inputDecoration;\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    _helperText = widget.tagsTextField.helperText ?? \"no matches\";\n    _suggestions = widget.tagsTextField.suggestions;\n    _constraintSuggestion = widget.tagsTextField.constraintSuggestion;\n    _inputDecoration = widget.tagsTextField.inputDecoration;\n    _fontSize = widget.tagsTextField.textStyle.fontSize;\n\n    return Stack(\n      alignment: Alignment.centerLeft,\n      children: <Widget>[\n        Visibility(\n          visible: _suggestions != null,\n          child: Container(\n            //width: double.infinity,\n            padding: _inputDecoration != null\n                ? _inputDecoration.contentPadding\n                : EdgeInsets.symmetric(\n                    vertical: 6 * (_fontSize / 14),\n                    horizontal: 6 * (_fontSize / 14)),\n            child: Text(\n              _matches.isNotEmpty ? (_matches.first) : \"\",\n              softWrap: false,\n              overflow: TextOverflow.fade,\n              style: TextStyle(\n                height: widget.tagsTextField.textStyle.height == null\n                    ? 1\n                    : widget.tagsTextField.textStyle.height,\n                fontSize: _fontSize ?? null,\n                color: widget.tagsTextField.suggestionTextColor ?? Colors.red,\n              ),\n            ),\n          ),\n        ),\n        TextField(\n          controller: _controller,\n          enabled: widget.tagsTextField.enabled,\n          autofocus: widget.tagsTextField.autofocus ?? true,\n          keyboardType: widget.tagsTextField.keyboardType ?? null,\n          textCapitalization: widget.tagsTextField.textCapitalization ??\n              TextCapitalization.none,\n          maxLength: widget.tagsTextField.maxLength ?? null,\n          maxLines: 1,\n          autocorrect: widget.tagsTextField.autocorrect ?? false,\n          style: widget.tagsTextField.textStyle.copyWith(\n              height: widget.tagsTextField.textStyle.height == null ? 1 : null),\n          decoration: _initialInputDecoration,\n          onChanged: (str) => _checkOnChanged(str),\n          onSubmitted: (str) => _onSubmitted(str),\n        )\n      ],\n    );\n  }\n\n  InputDecoration get _initialInputDecoration {\n    var input = _inputDecoration ??\n        InputDecoration(\n            disabledBorder: InputBorder.none,\n            errorBorder: InputBorder.none,\n            contentPadding: EdgeInsets.symmetric(\n                vertical: 6 * (_fontSize / 14),\n                horizontal: 6 * (_fontSize / 14)),\n            focusedBorder: UnderlineInputBorder(\n              borderSide: BorderSide(\n                color: Colors.blueGrey[300],\n              ),\n            ),\n            enabledBorder: UnderlineInputBorder(\n              borderSide:\n                  BorderSide(color: Colors.blueGrey[400].withOpacity(0.3)),\n            ),\n            border: UnderlineInputBorder(\n              borderSide:\n                  BorderSide(color: Colors.blueGrey[400].withOpacity(0.3)),\n            ));\n\n    return input.copyWith(\n        helperText: _helperCheck || _suggestions == null ? null : _helperText,\n        helperStyle: widget.tagsTextField.helperTextStyle,\n        hintText: widget.tagsTextField.hintText ?? 'Add a tag',\n        hintStyle: TextStyle(color: widget.tagsTextField.hintTextColor));\n  }\n\n  ///OnSubmitted\n  void _onSubmitted(String str) {\n    var onSubmitted = widget.onSubmitted;\n\n    if (_suggestions != null && _matches.isNotEmpty) str = _matches.first;\n\n    if (widget.tagsTextField.lowerCase) str = str.toLowerCase();\n\n    str = str.trim();\n\n    if (_suggestions != null) {\n      if (_matches.isNotEmpty || !_constraintSuggestion) {\n        if (onSubmitted != null) onSubmitted(str);\n        setState(() {\n          _matches = [];\n        });\n        _controller.clear();\n      }\n    } else if (str.isNotEmpty) {\n      if (onSubmitted != null) onSubmitted(str);\n      _controller.clear();\n    }\n  }\n\n  ///Check onChanged\n  void _checkOnChanged(String str) {\n    if (_suggestions != null) {\n      _matches =\n          _suggestions.where((String sgt) => sgt.startsWith(str)).toList();\n\n      if (str.isEmpty) _matches = [];\n\n      if (_matches.length > 1) _matches.removeWhere((String mtc) => mtc == str);\n\n      setState(() {\n        _helperCheck =\n            _matches.isNotEmpty || str.isEmpty || !_constraintSuggestion\n                ? true\n                : false;\n        _matches.sort((a, b) => a.compareTo(b));\n      });\n    }\n\n    if (widget.tagsTextField.onChanged != null)\n      widget.tagsTextField.onChanged(str);\n  }\n}\n\n/// Tags TextField\nclass TagsTextField {\n  TagsTextField(\n      {this.lowerCase = false,\n      this.textStyle = const TextStyle(fontSize: 14),\n      this.width = 200,\n      this.padding,\n      this.enabled = true,\n      this.duplicates = false,\n      this.suggestions,\n      this.constraintSuggestion = true,\n      this.autocorrect,\n      this.autofocus,\n      this.hintText,\n      this.hintTextColor,\n      this.suggestionTextColor,\n      this.helperText,\n      this.helperTextStyle,\n      this.keyboardType,\n      this.textCapitalization,\n      this.maxLength,\n      this.inputDecoration,\n      this.onSubmitted,\n      this.onChanged});\n\n  final double width;\n  final EdgeInsets padding;\n  final bool enabled;\n  final bool duplicates;\n  final TextStyle textStyle;\n  final InputDecoration inputDecoration;\n  final bool autocorrect;\n  final List<String> suggestions;\n\n  /// Allows you to insert tags not present in the list of suggestions\n  final bool constraintSuggestion;\n  final bool lowerCase;\n  final bool autofocus;\n  final String hintText;\n  final Color hintTextColor;\n  final Color suggestionTextColor;\n  final String helperText;\n  final TextStyle helperTextStyle;\n  final TextInputType keyboardType;\n  final TextCapitalization textCapitalization;\n  final int maxLength;\n  final OnSubmittedCallback onSubmitted;\n  final OnChangedCallback onChanged;\n}\n"
  },
  {
    "path": "lib/src/tags.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../flutter_tags.dart';\nimport 'util/custom_wrap.dart';\nimport 'package:flutter_tags/src/suggestions_textfield.dart';\n\n///ItemBuilder\ntypedef Widget ItemBuilder(int index);\n\nclass Tags extends StatefulWidget {\n  Tags(\n      {this.columns,\n      this.itemCount = 0,\n      this.symmetry = false,\n      this.horizontalScroll = false,\n      this.heightHorizontalScroll = 60,\n      this.spacing = 6,\n      this.runSpacing = 14,\n      this.alignment = WrapAlignment.center,\n      this.runAlignment = WrapAlignment.center,\n      this.direction = Axis.horizontal,\n      this.verticalDirection = VerticalDirection.down,\n      this.textDirection = TextDirection.ltr,\n      this.itemBuilder,\n      this.textField,\n      Key key})\n      : assert(itemCount >= 0),\n        assert(alignment != null),\n        assert(runAlignment != null),\n        assert(direction != null),\n        assert(verticalDirection != null),\n        assert(textDirection != null),\n        super(key: key);\n\n  ///specific number of columns\n  final int columns;\n\n  ///numer of item List\n  final int itemCount;\n\n  /// imposes the same width and the same number of columns for each row\n  final bool symmetry;\n\n  /// ability to scroll tags horizontally\n  final bool horizontalScroll;\n\n  /// horizontal spacing of  the [ItemTags]\n  final double heightHorizontalScroll;\n\n  /// horizontal spacing of  the [ItemTags]\n  final double spacing;\n\n  /// vertical spacing of  the [ItemTags]\n  final double runSpacing;\n\n  /// horizontal alignment of  the [ItemTags]\n  final WrapAlignment alignment;\n\n  /// vertical alignment of  the [ItemTags]\n  final WrapAlignment runAlignment;\n\n  /// direction of  the [ItemTags]\n  final Axis direction;\n\n  /// Iterate [Item] from the lower to the upper direction or vice versa\n  final VerticalDirection verticalDirection;\n\n  /// Text direction of  the [ItemTags]\n  final TextDirection textDirection;\n\n  /// Generates a list of [ItemTags].\n  ///\n  /// Creates a list with [length] positions and fills it with values created by\n  /// calling [generator] for each index in the range `0` .. `length - 1`\n  /// in increasing order.\n  final ItemBuilder itemBuilder;\n\n  /// custom TextField\n  final TagsTextField textField;\n\n  @override\n  TagsState createState() => TagsState();\n}\n\nclass TagsState extends State<Tags> {\n  final GlobalKey _containerKey = GlobalKey();\n  Orientation _orientation = Orientation.portrait;\n  double _width = 0;\n\n  final List<DataList> _list = List();\n\n  List<Item> get getAllItem => _list.toList();\n\n  //get the current width of the screen\n  void _getWidthContext() {\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      final keyContext = _containerKey.currentContext;\n      if (keyContext != null) {\n        final RenderBox box = keyContext.findRenderObject();\n        final size = box.size;\n        setState(() {\n          _width = size.width;\n        });\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // essential to avoid infinite loop of addPostFrameCallback\n    if (widget.symmetry &&\n        (MediaQuery.of(context).orientation != _orientation || _width == 0)) {\n      _orientation = MediaQuery.of(context).orientation;\n      _getWidthContext();\n    }\n\n    Widget child;\n    if (widget.horizontalScroll && !widget.symmetry)\n      child = Container(\n        height: widget.heightHorizontalScroll,\n        color: Colors.transparent,\n        child: ListView(\n          padding: EdgeInsets.all(0),\n          scrollDirection: Axis.horizontal,\n          shrinkWrap: true,\n          physics: ClampingScrollPhysics(),\n          children: _buildItems(),\n        ),\n      );\n    else\n      child = CustomWrap(\n        key: _containerKey,\n        alignment: widget.alignment,\n        runAlignment: widget.runAlignment,\n        spacing: widget.spacing,\n        runSpacing: widget.runSpacing,\n        column: widget.columns,\n        symmetry: widget.symmetry,\n        textDirection: widget.textDirection,\n        direction: widget.direction,\n        verticalDirection: widget.verticalDirection,\n        crossAxisAlignment: WrapCrossAlignment.end,\n        children: _buildItems(),\n      );\n\n    return DataListInherited(\n      list: _list,\n      symmetry: widget.symmetry,\n      itemCount: widget.itemCount,\n      child: child,\n    );\n  }\n\n  List<Widget> _buildItems() {\n    /*if(_list.length < widget.itemCount)\n            _list.clear();*/\n\n    final Widget textField = widget.textField != null\n        ? Container(\n            alignment: Alignment.center,\n            width: widget.symmetry ? _widthCalc() : widget.textField.width,\n            padding: widget.textField.padding,\n            child: SuggestionsTextField(\n              tagsTextField: widget.textField,\n              onSubmitted: (String str) {\n                if (!widget.textField.duplicates) {\n                  final List<DataList> lst =\n                      _list.where((l) => l.title == str).toList();\n\n                  if (lst.isNotEmpty) {\n                    lst.forEach((d) => d.showDuplicate = true);\n                    return;\n                  }\n                }\n\n                if (widget.textField.onSubmitted != null)\n                  widget.textField.onSubmitted(str);\n              },\n            ),\n          )\n        : null;\n\n    List<Widget> finalList = List();\n\n    List<Widget> itemList = List.generate(widget.itemCount, (i) {\n      final Widget item = widget.itemBuilder(i);\n      if (widget.symmetry)\n        return Container(\n          width: _widthCalc(),\n          child: item,\n        );\n      else if (widget.horizontalScroll)\n        return Container(\n          margin: EdgeInsets.symmetric(horizontal: widget.spacing),\n          alignment: Alignment.center,\n          child: item,\n        );\n      return item;\n    });\n\n    if (widget.horizontalScroll && widget.textDirection == TextDirection.rtl)\n      itemList = itemList.reversed.toList();\n\n    if (textField == null) {\n      finalList.addAll(itemList);\n      return finalList;\n    }\n\n    if (widget.horizontalScroll &&\n        widget.verticalDirection == VerticalDirection.up) {\n      finalList.add(textField);\n      finalList.addAll(itemList);\n    } else {\n      finalList.addAll(itemList);\n      finalList.add(textField);\n    }\n\n    return finalList;\n  }\n\n  //Container width divided by the number of columns when symmetry is active\n  double _widthCalc() {\n    int columns = widget.columns ?? 0;\n    int margin = widget.spacing.round();\n\n    int subtraction = columns * (margin);\n    double width = (_width > 1) ? (_width - subtraction) / columns : _width;\n\n    return width;\n  }\n}\n\n/// Inherited Widget\nclass DataListInherited extends InheritedWidget {\n  DataListInherited(\n      {Key key, this.list, this.symmetry, this.itemCount, Widget child})\n      : super(key: key, child: child);\n\n  final List<DataList> list;\n  final bool symmetry;\n  final int itemCount;\n\n  @override\n  bool updateShouldNotify(DataListInherited old) {\n    //print(\"inherited\");\n    return false;\n  }\n\n  /*static DataListInherited of(BuildContext context) =>\n      context.inheritFromWidgetOfExactType(DataListInherited);*/\n  static DataListInherited of(BuildContext context) =>\n      context.dependOnInheritedWidgetOfExactType();\n}\n\n/// Data List\nclass DataList extends ValueNotifier implements Item {\n  DataList(\n      {@required this.title,\n      this.index,\n      bool highlights = false,\n      bool active = true,\n      this.customData})\n      : _showDuplicate = highlights,\n        _active = active,\n        super(active);\n\n  final String title;\n  final dynamic customData;\n  final int index;\n\n  get showDuplicate {\n    final val = _showDuplicate;\n    _showDuplicate = false;\n    return val;\n  }\n\n  bool _showDuplicate;\n  set showDuplicate(bool a) {\n    _showDuplicate = a;\n    // rebuild only the specific Item that changes its value\n    notifyListeners();\n  }\n\n  get active => _active;\n  bool _active;\n  set active(bool a) {\n    _active = a;\n    // rebuild only the specific Item that changes its value\n    notifyListeners();\n  }\n}\n"
  },
  {
    "path": "lib/src/util/custom_wrap.dart",
    "content": "import 'dart:math' as math;\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart';\n\n/// Custom Wrap\nclass CustomWrap extends MultiChildRenderObjectWidget {\n  CustomWrap({\n    Key key,\n    this.column,\n    this.symmetry,\n    this.direction = Axis.horizontal,\n    this.alignment = WrapAlignment.start,\n    this.spacing = 0.0,\n    this.runAlignment = WrapAlignment.start,\n    this.runSpacing = 0.0,\n    this.crossAxisAlignment = WrapCrossAlignment.start,\n    this.textDirection,\n    this.verticalDirection = VerticalDirection.down,\n    List<Widget> children = const <Widget>[],\n  }) : super(key: key, children: children);\n\n  final int column;\n\n  final bool symmetry;\n\n  final Axis direction;\n\n  final WrapAlignment alignment;\n\n  final double spacing;\n\n  final WrapAlignment runAlignment;\n\n  final double runSpacing;\n\n  final WrapCrossAlignment crossAxisAlignment;\n\n  final TextDirection textDirection;\n\n  final VerticalDirection verticalDirection;\n\n  @override\n  CustomRenderWrap createRenderObject(BuildContext context) {\n    return CustomRenderWrap(\n      column: column,\n      symmetry: symmetry,\n      direction: direction,\n      alignment: alignment,\n      spacing: spacing,\n      runAlignment: runAlignment,\n      runSpacing: runSpacing,\n      crossAxisAlignment: crossAxisAlignment,\n      textDirection: textDirection ?? Directionality.of(context),\n      verticalDirection: verticalDirection,\n    );\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, CustomRenderWrap renderObject) {\n    renderObject\n      ..column = column\n      ..symmetry = symmetry\n      ..direction = direction\n      ..alignment = alignment\n      ..spacing = spacing\n      ..runAlignment = runAlignment\n      ..runSpacing = runSpacing\n      ..crossAxisAlignment = crossAxisAlignment\n      ..textDirection = textDirection ?? Directionality.of(context)\n      ..verticalDirection = verticalDirection;\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties.add(EnumProperty<Axis>('direction', direction));\n    properties.add(EnumProperty<WrapAlignment>('alignment', alignment));\n    properties.add(DoubleProperty('spacing', spacing));\n    properties.add(EnumProperty<WrapAlignment>('runAlignment', runAlignment));\n    properties.add(DoubleProperty('runSpacing', runSpacing));\n    properties.add(DoubleProperty('crossAxisAlignment', runSpacing));\n    properties.add(EnumProperty<TextDirection>('textDirection', textDirection,\n        defaultValue: null));\n    properties.add(EnumProperty<VerticalDirection>(\n        'verticalDirection', verticalDirection,\n        defaultValue: VerticalDirection.down));\n  }\n}\n\n/// Displays its children in multiple horizontal or vertical runs.\nclass CustomRenderWrap extends RenderBox\n    with\n        ContainerRenderObjectMixin<RenderBox, WrapParentData>,\n        RenderBoxContainerDefaultsMixin<RenderBox, WrapParentData> {\n  CustomRenderWrap({\n    List<RenderBox> children,\n    int column,\n    bool symmetry,\n    Axis direction = Axis.horizontal,\n    WrapAlignment alignment = WrapAlignment.start,\n    double spacing = 0.0,\n    WrapAlignment runAlignment = WrapAlignment.start,\n    double runSpacing = 0.0,\n    WrapCrossAlignment crossAxisAlignment = WrapCrossAlignment.start,\n    TextDirection textDirection,\n    VerticalDirection verticalDirection = VerticalDirection.down,\n  })  : assert(direction != null),\n        assert(alignment != null),\n        assert(spacing != null),\n        assert(runAlignment != null),\n        assert(runSpacing != null),\n        assert(crossAxisAlignment != null),\n        _column = column,\n        _symmetry = symmetry,\n        _direction = direction,\n        _alignment = alignment,\n        _spacing = spacing,\n        _runAlignment = runAlignment,\n        _runSpacing = runSpacing,\n        _crossAxisAlignment = crossAxisAlignment,\n        _textDirection = textDirection,\n        _verticalDirection = verticalDirection {\n    addAll(children);\n  }\n\n  int get column => _column;\n  int _column;\n  set column(int value) {\n    if (column == value) return;\n    _column = value;\n    markNeedsLayout();\n  }\n\n  bool get symmetry => _symmetry;\n  bool _symmetry;\n  set symmetry(bool value) {\n    if (symmetry == value) return;\n    _symmetry = value;\n    markNeedsLayout();\n  }\n\n  Axis get direction => _direction;\n  Axis _direction;\n  set direction(Axis value) {\n    assert(value != null);\n    if (_direction == value) return;\n    _direction = value;\n    markNeedsLayout();\n  }\n\n  WrapAlignment get alignment => _alignment;\n  WrapAlignment _alignment;\n  set alignment(WrapAlignment value) {\n    assert(value != null);\n    if (_alignment == value) return;\n    _alignment = value;\n    markNeedsLayout();\n  }\n\n  double get spacing => _spacing;\n  double _spacing;\n  set spacing(double value) {\n    assert(value != null);\n    if (_spacing == value) return;\n    _spacing = value;\n    markNeedsLayout();\n  }\n\n  WrapAlignment get runAlignment => _runAlignment;\n  WrapAlignment _runAlignment;\n  set runAlignment(WrapAlignment value) {\n    assert(value != null);\n    if (_runAlignment == value) return;\n    _runAlignment = value;\n    markNeedsLayout();\n  }\n\n  double get runSpacing => _runSpacing;\n  double _runSpacing;\n  set runSpacing(double value) {\n    assert(value != null);\n    if (_runSpacing == value) return;\n    _runSpacing = value;\n    markNeedsLayout();\n  }\n\n  WrapCrossAlignment get crossAxisAlignment => _crossAxisAlignment;\n  WrapCrossAlignment _crossAxisAlignment;\n  set crossAxisAlignment(WrapCrossAlignment value) {\n    assert(value != null);\n    if (_crossAxisAlignment == value) return;\n    _crossAxisAlignment = value;\n    markNeedsLayout();\n  }\n\n  TextDirection get textDirection => _textDirection;\n  TextDirection _textDirection;\n  set textDirection(TextDirection value) {\n    if (_textDirection != value) {\n      _textDirection = value;\n      markNeedsLayout();\n    }\n  }\n\n  VerticalDirection get verticalDirection => _verticalDirection;\n  VerticalDirection _verticalDirection;\n  set verticalDirection(VerticalDirection value) {\n    if (_verticalDirection != value) {\n      _verticalDirection = value;\n      markNeedsLayout();\n    }\n  }\n\n  bool get _debugHasNecessaryDirections {\n    assert(direction != null);\n    assert(alignment != null);\n    assert(runAlignment != null);\n    assert(crossAxisAlignment != null);\n    if (firstChild != null && lastChild != firstChild) {\n      // i.e. there's more than one child\n      switch (direction) {\n        case Axis.horizontal:\n          assert(textDirection != null,\n              'Horizontal $runtimeType with multiple children has a null textDirection, so the layout order is undefined.');\n          break;\n        case Axis.vertical:\n          assert(verticalDirection != null,\n              'Vertical $runtimeType with multiple children has a null verticalDirection, so the layout order is undefined.');\n          break;\n      }\n    }\n    if (alignment == WrapAlignment.start || alignment == WrapAlignment.end) {\n      switch (direction) {\n        case Axis.horizontal:\n          assert(textDirection != null,\n              'Horizontal $runtimeType with alignment $alignment has a null textDirection, so the alignment cannot be resolved.');\n          break;\n        case Axis.vertical:\n          assert(verticalDirection != null,\n              'Vertical $runtimeType with alignment $alignment has a null verticalDirection, so the alignment cannot be resolved.');\n          break;\n      }\n    }\n    if (runAlignment == WrapAlignment.start ||\n        runAlignment == WrapAlignment.end) {\n      switch (direction) {\n        case Axis.horizontal:\n          assert(verticalDirection != null,\n              'Horizontal $runtimeType with runAlignment $runAlignment has a null verticalDirection, so the alignment cannot be resolved.');\n          break;\n        case Axis.vertical:\n          assert(textDirection != null,\n              'Vertical $runtimeType with runAlignment $runAlignment has a null textDirection, so the alignment cannot be resolved.');\n          break;\n      }\n    }\n    if (crossAxisAlignment == WrapCrossAlignment.start ||\n        crossAxisAlignment == WrapCrossAlignment.end) {\n      switch (direction) {\n        case Axis.horizontal:\n          assert(verticalDirection != null,\n              'Horizontal $runtimeType with crossAxisAlignment $crossAxisAlignment has a null verticalDirection, so the alignment cannot be resolved.');\n          break;\n        case Axis.vertical:\n          assert(textDirection != null,\n              'Vertical $runtimeType with crossAxisAlignment $crossAxisAlignment has a null textDirection, so the alignment cannot be resolved.');\n          break;\n      }\n    }\n    return true;\n  }\n\n  @override\n  void setupParentData(RenderBox child) {\n    if (child.parentData is! WrapParentData)\n      child.parentData = WrapParentData();\n  }\n\n  double _computeIntrinsicHeightForWidth(double width) {\n    assert(direction == Axis.horizontal);\n    int runCount = 0;\n    double height = 0.0;\n    double runWidth = 0.0;\n    double runHeight = 0.0;\n    int childCount = 0;\n    RenderBox child = firstChild;\n    while (child != null) {\n      final double childWidth = child.getMaxIntrinsicWidth(double.infinity);\n      final double childHeight = child.getMaxIntrinsicHeight(childWidth);\n      if (runWidth + childWidth > width) {\n        height += runHeight;\n        if (runCount > 0) height += runSpacing;\n        runCount += 1;\n        runWidth = 0.0;\n        runHeight = 0.0;\n        childCount = 0;\n      }\n      runWidth += childWidth;\n      runHeight = math.max(runHeight, childHeight);\n      if (childCount > 0) runWidth += spacing;\n      childCount += 1;\n      child = childAfter(child);\n    }\n    if (childCount > 0) height += runHeight + runSpacing;\n    return height;\n  }\n\n  double _computeIntrinsicWidthForHeight(double height) {\n    assert(direction == Axis.vertical);\n    int runCount = 0;\n    double width = 0.0;\n    double runHeight = 0.0;\n    double runWidth = 0.0;\n    int childCount = 0;\n    RenderBox child = firstChild;\n    while (child != null) {\n      final double childHeight = child.getMaxIntrinsicHeight(double.infinity);\n      final double childWidth = child.getMaxIntrinsicWidth(childHeight);\n      if (runHeight + childHeight > height) {\n        width += runWidth;\n        if (runCount > 0) width += runSpacing;\n        runCount += 1;\n        runHeight = 0.0;\n        runWidth = 0.0;\n        childCount = 0;\n      }\n      runHeight += childHeight;\n      runWidth = math.max(runWidth, childWidth);\n      if (childCount > 0) runHeight += spacing;\n      childCount += 1;\n      child = childAfter(child);\n    }\n    if (childCount > 0) width += runWidth + runSpacing;\n    return width;\n  }\n\n  @override\n  double computeMinIntrinsicWidth(double height) {\n    switch (direction) {\n      case Axis.horizontal:\n        double width = 0.0;\n        RenderBox child = firstChild;\n        while (child != null) {\n          width = math.max(width, child.getMinIntrinsicWidth(double.infinity));\n          child = childAfter(child);\n        }\n        return width;\n      case Axis.vertical:\n        return _computeIntrinsicWidthForHeight(height);\n    }\n    return null;\n  }\n\n  @override\n  double computeMaxIntrinsicWidth(double height) {\n    switch (direction) {\n      case Axis.horizontal:\n        double width = 0.0;\n        RenderBox child = firstChild;\n        while (child != null) {\n          width += child.getMaxIntrinsicWidth(double.infinity);\n          child = childAfter(child);\n        }\n        return width;\n      case Axis.vertical:\n        return _computeIntrinsicWidthForHeight(height);\n    }\n    return null;\n  }\n\n  @override\n  double computeMinIntrinsicHeight(double width) {\n    switch (direction) {\n      case Axis.horizontal:\n        return _computeIntrinsicHeightForWidth(width);\n      case Axis.vertical:\n        double height = 0.0;\n        RenderBox child = firstChild;\n        while (child != null) {\n          height =\n              math.max(height, child.getMinIntrinsicHeight(double.infinity));\n          child = childAfter(child);\n        }\n        return height;\n    }\n    return null;\n  }\n\n  @override\n  double computeMaxIntrinsicHeight(double width) {\n    switch (direction) {\n      case Axis.horizontal:\n        return _computeIntrinsicHeightForWidth(width);\n      case Axis.vertical:\n        double height = 0.0;\n        RenderBox child = firstChild;\n        while (child != null) {\n          height += child.getMaxIntrinsicHeight(double.infinity);\n          child = childAfter(child);\n        }\n        return height;\n    }\n    return null;\n  }\n\n  @override\n  double computeDistanceToActualBaseline(TextBaseline baseline) {\n    return defaultComputeDistanceToHighestActualBaseline(baseline);\n  }\n\n  double _getMainAxisExtent(RenderBox child) {\n    switch (direction) {\n      case Axis.horizontal:\n        return child.size.width;\n      case Axis.vertical:\n        return child.size.height;\n    }\n    return 0.0;\n  }\n\n  double _getCrossAxisExtent(RenderBox child) {\n    switch (direction) {\n      case Axis.horizontal:\n        return child.size.height;\n      case Axis.vertical:\n        return child.size.width;\n    }\n    return 0.0;\n  }\n\n  Offset _getOffset(double mainAxisOffset, double crossAxisOffset) {\n    switch (direction) {\n      case Axis.horizontal:\n        return Offset(mainAxisOffset, crossAxisOffset);\n      case Axis.vertical:\n        return Offset(crossAxisOffset, mainAxisOffset);\n    }\n    return Offset.zero;\n  }\n\n  double _getChildCrossAxisOffset(bool flipCrossAxis, double runCrossAxisExtent,\n      double childCrossAxisExtent) {\n    final double freeSpace = runCrossAxisExtent - childCrossAxisExtent;\n    switch (crossAxisAlignment) {\n      case WrapCrossAlignment.start:\n        return flipCrossAxis ? freeSpace : 0.0;\n      case WrapCrossAlignment.end:\n        return flipCrossAxis ? 0.0 : freeSpace;\n      case WrapCrossAlignment.center:\n        return freeSpace / 2.0;\n    }\n    return 0.0;\n  }\n\n  bool _hasVisualOverflow = false;\n\n  @override\n  void performLayout() {\n    assert(_debugHasNecessaryDirections);\n    _hasVisualOverflow = false;\n    RenderBox child = firstChild;\n    if (child == null) {\n      size = constraints.smallest;\n      return;\n    }\n    BoxConstraints childConstraints;\n    double mainAxisLimit = 0.0;\n    bool flipMainAxis = false;\n    bool flipCrossAxis = false;\n    switch (direction) {\n      case Axis.horizontal:\n        childConstraints = BoxConstraints(maxWidth: constraints.maxWidth);\n        mainAxisLimit = constraints.maxWidth;\n        if (textDirection == TextDirection.rtl) flipMainAxis = true;\n        if (verticalDirection == VerticalDirection.up) flipCrossAxis = true;\n        break;\n      case Axis.vertical:\n        childConstraints = BoxConstraints(maxHeight: constraints.maxHeight);\n        mainAxisLimit = constraints.maxHeight;\n        if (verticalDirection == VerticalDirection.up) flipMainAxis = true;\n        if (textDirection == TextDirection.rtl) flipCrossAxis = true;\n        break;\n    }\n    assert(childConstraints != null);\n    assert(mainAxisLimit != null);\n    final double spacing = this.spacing;\n    final double runSpacing = this.runSpacing;\n    final List<_RunMetrics> runMetrics = <_RunMetrics>[];\n    double mainAxisExtent = 0.0;\n    double crossAxisExtent = 0.0;\n    double runMainAxisExtent = 0.0;\n    double runCrossAxisExtent = 0.0;\n    int childCount = 0;\n\n    int cnt = 0;\n    while (child != null) {\n      child.layout(childConstraints, parentUsesSize: true);\n      final double childMainAxisExtent = _getMainAxisExtent(child);\n      final double childCrossAxisExtent = _getCrossAxisExtent(child);\n      if ((childCount > 0 &&\n              runMainAxisExtent + spacing + childMainAxisExtent >\n                  mainAxisLimit) ||\n          (_column != null && _column != 0 && cnt == _column)) {\n        cnt = 0;\n        mainAxisExtent = math.max(mainAxisExtent, runMainAxisExtent);\n        crossAxisExtent += runCrossAxisExtent;\n        if (runMetrics.isNotEmpty) crossAxisExtent += runSpacing;\n        runMetrics.add(\n            _RunMetrics(runMainAxisExtent, runCrossAxisExtent, childCount));\n        runMainAxisExtent = 0.0;\n        runCrossAxisExtent = 0.0;\n        childCount = 0;\n      }\n      cnt++;\n      runMainAxisExtent += childMainAxisExtent;\n      if (childCount > 0) runMainAxisExtent += spacing;\n      runCrossAxisExtent = math.max(runCrossAxisExtent, childCrossAxisExtent);\n      childCount += 1;\n      final WrapParentData childParentData = child.parentData;\n      childParentData._runIndex = runMetrics.length;\n      child = childParentData.nextSibling;\n    }\n    if (childCount > 0) {\n      mainAxisExtent = math.max(mainAxisExtent, runMainAxisExtent);\n      crossAxisExtent += runCrossAxisExtent;\n      if (runMetrics.isNotEmpty) crossAxisExtent += runSpacing;\n      runMetrics\n          .add(_RunMetrics(runMainAxisExtent, runCrossAxisExtent, childCount));\n    }\n\n    final int runCount = runMetrics.length;\n    assert(runCount > 0);\n\n    double containerMainAxisExtent = 0.0;\n    double containerCrossAxisExtent = 0.0;\n\n    switch (direction) {\n      case Axis.horizontal:\n        size = constraints.constrain(Size(mainAxisExtent, crossAxisExtent));\n        containerMainAxisExtent = size.width;\n        containerCrossAxisExtent = size.height;\n        break;\n      case Axis.vertical:\n        size = constraints.constrain(Size(crossAxisExtent, mainAxisExtent));\n        containerMainAxisExtent = size.height;\n        containerCrossAxisExtent = size.width;\n        break;\n    }\n\n    _hasVisualOverflow = containerMainAxisExtent < mainAxisExtent ||\n        containerCrossAxisExtent < crossAxisExtent;\n\n    final double crossAxisFreeSpace =\n        math.max(0.0, containerCrossAxisExtent - crossAxisExtent);\n    double runLeadingSpace = 0.0;\n    double runBetweenSpace = 0.0;\n    switch (runAlignment) {\n      case WrapAlignment.start:\n        break;\n      case WrapAlignment.end:\n        runLeadingSpace = crossAxisFreeSpace;\n        break;\n      case WrapAlignment.center:\n        runLeadingSpace = crossAxisFreeSpace / 2.0;\n        break;\n      case WrapAlignment.spaceBetween:\n        runBetweenSpace =\n            runCount > 1 ? crossAxisFreeSpace / (runCount - 1) : 0.0;\n        break;\n      case WrapAlignment.spaceAround:\n        runBetweenSpace = crossAxisFreeSpace / runCount;\n        runLeadingSpace = runBetweenSpace / 2.0;\n        break;\n      case WrapAlignment.spaceEvenly:\n        runBetweenSpace = crossAxisFreeSpace / (runCount + 1);\n        runLeadingSpace = runBetweenSpace;\n        break;\n    }\n\n    runBetweenSpace += runSpacing;\n    double crossAxisOffset = flipCrossAxis\n        ? containerCrossAxisExtent - runLeadingSpace\n        : runLeadingSpace;\n\n    child = firstChild;\n    for (int i = 0; i < runCount; ++i) {\n      final _RunMetrics metrics = runMetrics[i];\n      final double runMainAxisExtent = metrics.mainAxisExtent;\n      final double runCrossAxisExtent = metrics.crossAxisExtent;\n      final int childCount = metrics.childCount;\n\n      final double mainAxisFreeSpace =\n          math.max(0.0, containerMainAxisExtent - runMainAxisExtent);\n      double childLeadingSpace = 0.0;\n      double childBetweenSpace = 0.0;\n\n      //print(symmetry);\n      switch (alignment) {\n        case WrapAlignment.start:\n          if (symmetry) childLeadingSpace = spacing / 2;\n          break;\n        case WrapAlignment.end:\n          childLeadingSpace = mainAxisFreeSpace;\n          if (symmetry) childLeadingSpace = mainAxisFreeSpace - spacing / 2;\n          break;\n        case WrapAlignment.center:\n          childLeadingSpace = mainAxisFreeSpace / 2.0;\n          break;\n        case WrapAlignment.spaceBetween:\n          childBetweenSpace =\n              childCount > 1 ? mainAxisFreeSpace / (childCount - 1) : 0.0;\n          break;\n        case WrapAlignment.spaceAround:\n          childBetweenSpace = mainAxisFreeSpace / childCount;\n          childLeadingSpace = childBetweenSpace / 2.0;\n          break;\n        case WrapAlignment.spaceEvenly:\n          childBetweenSpace = mainAxisFreeSpace / (childCount + 1);\n          childLeadingSpace = childBetweenSpace;\n          break;\n      }\n\n      childBetweenSpace += spacing;\n      double childMainPosition = flipMainAxis\n          ? containerMainAxisExtent - childLeadingSpace\n          : childLeadingSpace;\n\n      if (flipCrossAxis) crossAxisOffset -= runCrossAxisExtent;\n\n      while (child != null) {\n        final WrapParentData childParentData = child.parentData;\n        if (childParentData._runIndex != i) break;\n        final double childMainAxisExtent = _getMainAxisExtent(child);\n        final double childCrossAxisExtent = _getCrossAxisExtent(child);\n        final double childCrossAxisOffset = _getChildCrossAxisOffset(\n            flipCrossAxis, runCrossAxisExtent, childCrossAxisExtent);\n        if (flipMainAxis) childMainPosition -= childMainAxisExtent;\n        childParentData.offset = _getOffset(\n            childMainPosition, crossAxisOffset + childCrossAxisOffset);\n        if (flipMainAxis)\n          childMainPosition -= childBetweenSpace;\n        else\n          childMainPosition += childMainAxisExtent + childBetweenSpace;\n        child = childParentData.nextSibling;\n      }\n\n      if (flipCrossAxis)\n        crossAxisOffset -= runBetweenSpace;\n      else\n        crossAxisOffset += runCrossAxisExtent + runBetweenSpace;\n    }\n  }\n\n  @override\n  bool hitTestChildren(HitTestResult result, {Offset position}) {\n    return defaultHitTestChildren(result, position: position);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    // TODO(ianh): move the debug flex overflow paint logic somewhere common so\n    // it can be reused here\n    if (_hasVisualOverflow)\n      context.pushClipRect(\n          needsCompositing, offset, Offset.zero & size, defaultPaint);\n    else\n      defaultPaint(context, offset);\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties.add(EnumProperty<Axis>('direction', direction));\n    properties.add(EnumProperty<WrapAlignment>('alignment', alignment));\n    properties.add(DoubleProperty('spacing', spacing));\n    properties.add(EnumProperty<WrapAlignment>('runAlignment', runAlignment));\n    properties.add(DoubleProperty('runSpacing', runSpacing));\n    properties.add(DoubleProperty('crossAxisAlignment', runSpacing));\n    properties.add(EnumProperty<TextDirection>('textDirection', textDirection,\n        defaultValue: null));\n    properties.add(EnumProperty<VerticalDirection>(\n        'verticalDirection', verticalDirection,\n        defaultValue: VerticalDirection.down));\n  }\n}\n\nclass _RunMetrics {\n  _RunMetrics(this.mainAxisExtent, this.crossAxisExtent, this.childCount);\n\n  final double mainAxisExtent;\n  final double crossAxisExtent;\n  final int childCount;\n}\n\n/// Parent data for use with [CustomRenderWrap].\nclass WrapParentData extends ContainerBoxParentData<RenderBox> {\n  int _runIndex = 0;\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: flutter_tags\ndescription: Creating selectable and input tags (TextField) has never been easier.\nversion: 0.4.9+1\nauthor: Antonino Di Natale <gyorgio88@gmail.com>\nhomepage: https://github.com/Dn-a/flutter_tags\n\nenvironment:\n  sdk: \">=2.0.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n"
  },
  {
    "path": "test/flutter_tags_test.dart",
    "content": "import 'package:flutter_test/flutter_test.dart';\n\nvoid main() {}\n"
  }
]