Флаттер: почему при замене виджетов stateLESS эти виджеты перестраиваются - если я не использую ключи? - PullRequest
0 голосов
/ 03 апреля 2020

Мой код ниже основан на видео на этой странице и этой статье . Каждый раз, когда вы нажимаете кнопку, он меняет местами две цветные плитки StateLESS.

Печать в Tile.build показывает

  • с ключами на плитках, т.е. Tile() : super(key: UniqueKey());, плитки делают НЕ ПЕРЕЗАГРУЗИТЬ, когда вы нажимаете кнопку.
  • БЕЗ клавиш на плитках, т. Е. Tile() : super(key: null);, плитки перезаписываются при нажатии кнопки.

Почему это так?

Вот код:

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: Home()));

class Home extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => HomeState();
}

class HomeState extends State<Home> {
  List<Widget> tiles = [Tile(), Tile()];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Swap stateLESS tiles')),
      body: Row(children: tiles),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() => tiles.insert(1, tiles.removeAt(0)));
        },
      ),
    );
  }
}

class Tile extends StatelessWidget {
  static var count = 0;
  final color = Colors.blue[++count * 100];

  Tile() : super(key: UniqueKey());

  @override
  Widget build(BuildContext context) {
    print('${DateTime.now()}: build: $context');
    return Container(color: color, width: 140, height: 140);
  }
}

О моем флаттере:

$ flutter doctor -v
[✓] Flutter (Channel master, v1.16.4-pre.69, on Linux, locale en_GB.UTF-8)
    • Flutter version 1.16.4-pre.69 at /home/me/flutter
    • Framework revision 19e7db585d (2 days ago), 2020-04-01 11:16:01 -0700
    • Engine revision c9506cb8e9
    • Dart version 2.8.0 (build 2.8.0-dev.18.0 eea9717938)

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at /home/me/Android/Sdk
    • Platform android-29, build-tools 29.0.3
    • Java binary at: /home/me/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)
    • All Android licenses accepted.

[✓] Android Studio (version 3.6)
    • Android Studio at /home/me/android-studio
    • Flutter plugin version 43.0.1
    • Dart plugin version 191.8593
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)

[✓] IntelliJ IDEA Community Edition (version 2019.3)
    • IntelliJ at /home/me/idea-IC-193.6494.35
    • Flutter plugin version 44.0.3
    • Dart plugin version 193.6494.35

[✓] VS Code (version 1.43.2)
    • VS Code at /usr/share/code
    • Flutter extension version 3.8.1

[✓] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 10 (API 29) (emulator)

• No issues found!

Поведение такое же, когда я использую «стабильный» канал вместо «мастер».

$ flutter doctor -v
[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Linux, locale en_GB.UTF-8)
    • Flutter version 1.12.13+hotfix.9 at /home/me/flutter
    • Framework revision f139b11009 (4 days ago), 2020-03-30 13:57:30 -0700
    • Engine revision af51afceb8
    • Dart version 2.7.2

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at /home/me/Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.3
    • Java binary at: /home/me/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)
    • All Android licenses accepted.

[✓] Android Studio (version 3.6)
    • Android Studio at /home/me/android-studio
    • Flutter plugin version 43.0.1
    • Dart plugin version 191.8593
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)

[✓] IntelliJ IDEA Community Edition (version 2019.3)
    • IntelliJ at /home/me/idea-IC-193.6494.35
    • Flutter plugin version 44.0.3
    • Dart plugin version 193.6494.35

[✓] VS Code (version 1.43.2)
    • VS Code at /usr/share/code
    • Flutter extension version 3.9.0

[✓] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 10 (API 29) (emulator)

• No issues found!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...