使用 widget.[variable_name] 是引用 StatefulWidget 变量的最佳方式吗?

Is using widget.[variable_name] the best way to reference StatefulWidget variables?

我有一个传递给 FriendsFeed class 的变量 friendsList。我在 FriendsFeed 状态中用 widget.friendsList 引用 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);
        });
      },
    );
  }
}

是的,是的。但是仍然有一些方法可以使它更干净。

一种方法是在构建方法中创建最终变量或作为应用程序中的最终字段,例如“friendList”,然后为其分配值“widget.friendsList”。您现在可以在构建函数或您的应用程序中的任何位置继续使用 var“friendList”(取决于您声明它的位置)。

因此,从您的代码看来,您似乎希望能够 re-order/re-arrange 列表中的项目,这意味着能够修改列表,我建议您在您的状态下创建一个字段 class 像这样:

    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);
        });
      },
    );
  }
}