tree f9ea67ca56e67e36b1b7084e56406280d45d748b
parent ca758ac49b0e93798ce3fbe49e2c8ce290d5e136
author Victor Sanni <victorsanniay@gmail.com> 1744679040 -0400
committer GitHub <noreply@github.com> 1744679040 +0000
gpgsig -----BEGIN PGP SIGNATURE-----
 
 wsFcBAABCAAQBQJn/bCPCRC1aQ7uu5UhlAAA3ggQAD0YY81Ksly2io7KscK1WEcN
 il9E1P1TG+Rv1KrkN/RXNZrtfeN93nwNMeOlX/1fD6WXiO5FumDpc7zSoIZHYrCG
 XT4s41dRaj4xocmD9F3etOliguR5NY3PVnD7Iq43ROVSTevwhX0lGTahA/DrL3ab
 B6tWnb4vYHqI3GkMtHlRKooWzcXVYE2bDEcA8hCAGdcsoHOmTmyfbmMBOe3uA+8n
 YDGFA6xBvxMAz+WJGLzV8U92D3zQc1lRSOwXIkOMA+stE8mjnmctRihljL7arT84
 3L+oFs+sndab4rXTmnnS2m0NcQlP1Q2EJRkvIGFXHEy3H6B/uasjQi1D0Hu9n8FM
 GyOf83QMpI3VS/rBQhbWqK7AAR+mEUMdje5F8NvVaLPZcWmGLybAp0xTVjjzFqif
 mJADg2Kmt63SsvyppqMVSOLH0d3VfZe1AB2IRvtE+b372SHA1i3OIacIf8Nqf53S
 kK2uclz3w6/6y7RvlH2x1jSBlfBP36UitbrnYiRKlPqVZHIJWxtSS8ExU1BeukNi
 RucZZIiLih8iuWWp9G1+qEv3Wwp7LaYR8YbJTEamXfMirar87FPR3Xpe9LjdSnO0
 P72SGfOq/CegHTgYgzONohOeBHGzluP7FjMY76Tja6PkTskPJD1CC+4PJ5CPvYDA
 5CRX/QKYAKDIMt28brfo
 =/khO
 -----END PGP SIGNATURE-----
 

Persistent CupertinoListTile leading and trailing (#166799)

The bug occurs because the background color passed into the underlying
`Container` changes from null to `backgroundColorActivated`. Under the
hood, the `Container` wraps its child in a `ColoredBox` only if the
color is non-null. So the extra wrapping with a `ColoredBox` happening
mid-animation breaks reparenting, causing the widgets to be
replaced/inflated instead of updated.

### Before



https://github.com/user-attachments/assets/ca0b657a-1340-405f-8c1d-34b34366b994



### After



https://github.com/user-attachments/assets/8445c55c-0d5d-4b5f-96d2-4f12d908bdec





Fixes [CupertinoListTile animations are not running when pressing
longer](https://github.com/flutter/flutter/issues/153225)

<details>
<summary>Sample code</summary>

```dart

import 'package:flutter/cupertino.dart';

void main() => runApp(const ListTileApp());

class ListTileApp extends StatelessWidget {
  const ListTileApp({super.key});

  @override
  Widget build(BuildContext context) {
    return CupertinoApp(home: const ListTileExample());
  }
}

class ListTileExample extends StatefulWidget {
  const ListTileExample({super.key});

  @override
  State<ListTileExample> createState() => _ListTileExampleState();
}

class _ListTileExampleState extends State<ListTileExample> {
  bool _pushedToggle = false;

  void _toggle() {
    setState(() {
      _pushedToggle = !_pushedToggle;
    });
  }

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      child: Center(
        child: SizedBox(
          height: 40,
          child: CupertinoListTile(
              onTap: _toggle,
              title: Center(
                child: Text(
                  'Toggle',
                ),
              ),
              leading: CupertinoSwitch(
                value: _pushedToggle,
                onChanged: (_) {},
              ),
              trailing: CupertinoSwitch(
                value: _pushedToggle,
                onChanged: (_) {},
              )),
        ),
      ),
    );
  }
}


```

</details>