dart - 从 Function Widget 到 Flutter 中的 StatelessWidget

标签 dart flutter

我正在使用 Google Lab 示例中的 firestore。我想要发生的是将 _buildList() 和 _buildListItem() 函数 Widget 转换为包含参数的 StatelessWidget,因为我在一篇文章中指出拆分为函数 Widget 是性能反模式。但我不知道从哪里开始。任何可以阐明这个问题的人。谢谢。

class _VideoListState extends State<VideoList> {
  @override
  Widget build(BuildContext context) {
    ...
    body: StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection(widget.category).snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) return LinearProgressIndicator();
        // I want StatelessWidget not function widget
        return _buildList(context, snapshot.data.documents);
      },
    ),
  );
}

Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
    return ListView(
        // I want StatelessWidget not function widget
        children: snapshot.map((data) => _buildListItem(context, data)).toList(),            
  );
}

Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
  final record = Record.fromSnapshot(data);

  return Column(
    children: <Widget>[
        Text(record.title),
        YoutubePlayer(
             source: record.videoId.toString(),
             quality: YoutubeQuality.LOW,
             autoPlay: false,
             context: context
        );
    } 
}

最佳答案

很简单。查看源代码并阅读注释。来源是自动解释的。我已将您的方法名称用作类名称。

// the method buildList into a stateless widget
class BuildListWidget extends StatelessWidget{
  final List<DocumentSnapshot> snapshotList;

  BuildListWidget({this.snapshotList}){} // you can use this approach to initialize your snapshotList. 
  // Here there parameter is already the member of class snapshotList

  @override
  Widget build(BuildContext context) {
    //building a listView in this way allows you build items on demand.
    return ListView.builder(
        itemCount: snapshotList.length, // number of items in list
        itemBuilder: (BuildContext context, int index){
          //creating list members. Each one with your DocumentSnapshot from list
          return BuildListItemWidget(
            dataSnapshot: snapshotList[index], // getting DocumentSnapshot from list
          );
        }
    );
  }
}


// the mehtod _buildListItem into a stateless widget
class BuildListItemWidget extends StatelessWidget {
  final DocumentSnapshot _data; // just if you want to hold a snapshot...
  final Record _record; // your record reference

//here another approach to inicialize class data using named parameters and
// initialization list in class contructor
  BuildListItemWidget({@required DocumentSnapshot dataSnapshot}) :
      _record = Record.fromSnapshot(dataSnapshot),
      _data = dataSnapshot;

  @override
  Widget build(BuildContext context) {
    return Column(
        children: <Widget>[
          Text(record.title),
          YoutubePlayer(source: _record.videoId.toString(),
            quality: YoutubeQuality.LOW,
            autoPlay: false,
            context: context
          );
    }
}

// usage...
class _VideoListState extends State<VideoList> {
  @override
  Widget build(BuildContext context) {
    ...
    body: StreamBuilder<QuerySnapshot>(
    stream: Firestore.instance.collection(widget.category).snapshots(),
    builder: (context, snapshot) {
    if (!snapshot.hasData) return LinearProgressIndicator();
    // so here you have a statelessWidget
    return  BuildListWidget( snapshotList: snapshot.data.documents );
    },
    ),
  }
}

关于dart - 从 Function Widget 到 Flutter 中的 StatelessWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54672435/

相关文章:

firebase - 在空上调用了 'toLowerCase'方法。

android-studio - Flutter:无法编辑pubspec.yml文件,尝试编辑pubspec.yml文件时显示 “File is read-only”弹出警告

Android Studio 代码建议不适用于 Flutter

asynchronous - async/await - 在 future() 之前不等待 - Dart

flutter - 在Flutter中将forEach循环转换为Future.forEach循环

dart - 在Linux Armhf机器上构建 “Dart SDK”的问题

flutter - SliverAppBar 滚动时 flexibleSpace 内的图标不隐藏

flutter - 如何通过使用Flutter在单击按钮时创建覆盖

dart - IndexedWidgetBuilder,它是怎么知道索引的呢?

dart - 有没有办法在 flutter 中设置多色标签栏?