Использует виджет.[имя переменной] лучший способ ссылаться на переменные StatefulWidget?

#flutter #dart #variables #widget #statefulwidget

Вопрос:

У меня есть переменная friendsList , которая передается классу FriendsFeed. Я ссылаюсь friendsList на состояние в FriendsFeed с widget.friendsList помощью . Является ли использование widget.[my_variable_name] для ссылки на переменные StatefulWidget профессиональным способом сделать это? Я не могу не чувствовать, что есть более чистый способ сделать это.

 import 'package:flutter/material.dart';

class FriendsFeed extends StatefulWidget {
  FriendsFeed(this.friendsList);

  final List<dynamic> friendsList;

  @override
  _FriendsFeedState createState() => _FriendsFeedState();
}

class _FriendsFeedState extends State<FriendsFeed> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final ColorScheme colorScheme = Theme.of(context).colorScheme;
    final Color oddItemColor = colorScheme.primary.withOpacity(0.05);
    final Color evenItemColor = colorScheme.primary.withOpacity(0.15);

    return ReorderableListView(
      padding: const EdgeInsets.symmetric(horizontal: 40),
      children: <Widget>[
        for (int index = 0; index < widget.friendsList.length; index  )
          ListTile(
            key: Key('$index'),
            tileColor:
                widget.friendsList[index].isOdd ? oddItemColor : evenItemColor,
            title: Text('Item ${widget.friendsList[index]}'),
          ),
      ],
      onReorder: (int oldIndex, int newIndex) {
        setState(() {
          if (oldIndex < newIndex) {
            newIndex -= 1;
          }
          final int item = widget.friendsList.removeAt(oldIndex);
          widget.friendsList.insert(newIndex, item);
        });
      },
    );
  }
}
 

Ответ №1:

Да, это так. Но все еще есть способы сделать его чище.

Один из способов-создать конечную переменную внутри метода сборки или в качестве последнего поля в вашем приложении, скажем «Список друзей», и вы присваиваете ей значение «widget.friendsList». Теперь вы можете продолжать использовать var «Список друзей» в любом месте функции сборки или в своем приложении (в зависимости от того, где вы его объявили).

Итак, поскольку из вашего кода кажется, что вы хотите иметь возможность переупорядочивать/переупорядочивать элементы в списке, что означает возможность изменять список, я предлагаю вам создать поле в вашем классе состояния следующим образом:

     class FriendsFeed extends StatefulWidget {
      FriendsFeed(this.friendsList);

      final List<dynamic> friendsList;

      @override
      _FriendsFeedState createState() => _FriendsFeedState();
    }

    class _FriendsFeedState extends State<FriendsFeed> {
      // declare it here if you wish to make any modification to the list 
      // outside the build function.
      late List<dynamic> _friendsList;

      @override
      void initState() {
      _friendsList = widget.friendsList;

      super.initState();
    }

      @override
      Widget build(BuildContext context) {
      final ColorScheme colorScheme = Theme.of(context).colorScheme;
      final Color oddItemColor = colorScheme.primary.withOpacity(0.05);
      final Color evenItemColor = colorScheme.primary.withOpacity(0.15);

      return ReorderableListView(
       padding: const EdgeInsets.symmetric(horizontal: 40),
        children: <Widget>[
         for (int index = 0; index < _friendsList.length; index  )
          ListTile(
            key: Key('$index'),
            tileColor: _friendsList[index].isOdd ? oddItemColor : evenItemColor,
            title: Text('Item ${_friendsList[index]}'),
          ),
      ],
      onReorder: (int oldIndex, int newIndex) {
        setState(() {
          if (oldIndex < newIndex) {
            newIndex -= 1;
          }
          final int item = _friendsList.removeAt(oldIndex);
          _friendsList.insert(newIndex, item);
        });
      },
    );
  }
}