)]}'
{
  "commit": "3527084dcf6b9c2151577e461af5fcca221b32df",
  "tree": "f17fe9e13bd85355d72381eb4aef3a6361e8d33f",
  "parents": [
    "a091e623ad0b5ee8ea1a824d7a3747ed85ae0318"
  ],
  "author": {
    "name": "Alex Li",
    "email": "github@alexv525.com",
    "time": "Tue Aug 18 05:34:25 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Aug 18 05:34:25 2026 +0000"
  },
  "message": "Add numeric-password variation to TextInputType.numberWithOptions (#190637)\n\nWorking towards #190204.\n\nFramework companion to the engine/embedding change in #190207.\n\n## Summary\n\nAdds a `password` parameter to `TextInputType.numberWithOptions`,\nsymmetric to the existing `visiblePassword` text-class variation.\n\n```dart\nconst TextInputType.numberWithOptions({\n  this.signed \u003d false,\n  this.decimal \u003d false,\n  this.password \u003d false,   // NEW\n});\n```\n\nOn Android this maps to\n[`TYPE_NUMBER_VARIATION_PASSWORD`](https://developer.android.com/reference/android/text/InputType#TYPE_NUMBER_VARIATION_PASSWORD),\nwhich the embedding now parses via `json.optBoolean(\"password\", false)`\nand ORs into the NUMBER branch of\n`TextInputPlugin.inputTypeFromTextInputType` (#190207). It has no effect\non iOS, web, or desktop.\n\n`password: true` declares the **platform** input classification only. It\ndoes not obscure the glyphs Flutter renders — that remains the\nresponsibility of `obscureText`.\n\n## Backward compatibility\n\n- Additive; default `false`; existing `TextInputType.number` and\n`numberWithOptions(...)` callers are byte-for-byte unchanged.\n- JSON is additive — older engines ignore the extra `password` key.\n- No change to `obscureText`, `AutofillHints`, or\n`enableIMEPersonalizedLearning` semantics.\n\n`toJson`, `operator \u003d\u003d`, `hashCode`, `toString`, and dartdoc are updated\naccordingly.\n\n## Landing order\n\nPer Tree Hygiene the engine JSON parsing + Android mapping (#190207,\nmerged) lands first; this framework field follows once the engine\nrevision is rolled into the framework.\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [AI contribution guidelines] and understand my\nresponsibilities, or I am not using AI tools.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [x] I signed the [CLA].\n- [x] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant documentation (doc comments with `///`).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [x] All existing and new tests are passing.\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview\n[AI contribution guidelines]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md\n[test-exempt]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests\n[Flutter Style Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md\n[Features we expect every widget to implement]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement\n[CLA]: https://cla.developers.google.com/\n[flutter/tests]: https://github.com/flutter/tests\n[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Data Driven Fixes]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "db503abfce412fcdfce4ad3ae29bb653165cb410",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/services/text_input.dart",
      "new_id": "1ff0e2fdb4cfd7a75bd2fed220224014d26f76ad",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/services/text_input.dart"
    },
    {
      "type": "modify",
      "old_id": "ca6a88fbba1abe96a2df4412d023260cf5e7f308",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/editable_text.dart",
      "new_id": "74c0dea4f75acf4bd575ac6f4a9780644da574aa",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/editable_text.dart"
    },
    {
      "type": "modify",
      "old_id": "83e4ac59cb393fa6300c8ed7693fd270d693f038",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/services/text_input_test.dart",
      "new_id": "3407f9e59c1fe3373ea245983591ea1ace38620d",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/services/text_input_test.dart"
    },
    {
      "type": "modify",
      "old_id": "d0e7abdb85e813b0ffa40fc3bd6be5d427446b1d",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/widgets/editable_text_test.dart",
      "new_id": "1d450c4118d91cd013f562c180af797bee98ee99",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/widgets/editable_text_test.dart"
    }
  ]
}
