在 ListView 中具有不同小部件的 Flutter 抽象类

标签 flutter dart

我正在尝试弄清楚如何显示包含混合项目的 ListView 。我不知道如何显示列表项。请考虑以下代码。这应该会直接运行(除了现在第 82 行的错误。

我创建了一个抽象类、一个实现文本区域的类和一个实现按钮区域的类。我将它们混合在一起,因为这将是数据流入的方式。随机。

所以我可以构建混合类,我只是不知道如何在屏幕上进行最终显示。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

abstract class  MixedWidgets{
  //Different type of widgets I want to mix randomly;
  Widget buildText(BuildContext context);
  Widget buildButton(BuildContext context);
}

//this should show some text
class TextClass implements MixedWidgets{
  Widget buildButton(BuildContext context) => null;

  TextClass({this.textStringToPrint});

  String textStringToPrint;

  Widget buildText(BuildContext context){
    return Container(
      child: Text(textStringToPrint),
    );
  }
}

//This should show a button
class ButtonClass implements MixedWidgets{
  Widget buildText(BuildContext context) => null;

  ButtonClass({this. buttonNumber});

  int buttonNumber;

  Widget buildButton(BuildContext context){
    return FlatButton(
        onPressed: null,
        child: Text('This is button number $buttonNumber'),
    );
  }
}

//List<MixedWidgets> myListOfMixedWidgets = [];
final firstN = ButtonClass(buttonNumber: 1);
final secondN = ButtonClass(buttonNumber: 2);
final thirdN = ButtonClass(buttonNumber: 3);
final fourthN = ButtonClass(buttonNumber: 4);
final fifthN = ButtonClass(buttonNumber: 5);

final firstT = TextClass(textStringToPrint: 'one');
final secondT = TextClass(textStringToPrint: 'two');
final thirdT = TextClass(textStringToPrint: 'three');
final fourthT = TextClass(textStringToPrint: 'four');



class MyApp extends StatelessWidget {
  //Mix up my different classes and widgets in here
  List<MixedWidgets> myListOfMixedWidgets = [
    firstN,
    secondN,
    firstT,
    thirdN,
    fourthN,
    secondT,
    thirdT,
    fourthT,
    fifthN,
  ];


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
      appBar: AppBar(),
      body: SafeArea(
        child: Container(
          child: ListView(
            //How do I do this?  I need to show the mixed list here?
            children: myListOfMixedWidgets,
          ),
        ),
      )
    )
    );
  }
}

最佳答案

这里您要使用的策略是多态性。使用 StatelessWidget 和 StatefulWidget 的父类(super class) Widget 创建异构 Widget 列表 ( List<Widget> )。

如果 TextClass 和 ButtonClass 继承自 Widget 的某个后代,那么它们都可以添加到 widget 列表中。这适用于 ListView,因为它的 Children 参数只识别 Widget。

class TextClass extends StatelessWidget {
  const TextClass({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text("Text!");
  }
}

class ButtonClass extends StatelessWidget {
  const ButtonClass({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return FlatButton(
      onPressed: null,
      child: Text("Button!");
    );
  }
}

final ButtonClass firstN = ButtonClass();
final TextClass firstT = TextClass();

class MyApp extends StatelessWidget {
  // Polymorphism here:
  List<Widget> myListOfMixedWidgets = [
    firstN,
    firstT,
  ];

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: myListOfMixedWidgets,
    );
  }
}

关于在 ListView 中具有不同小部件的 Flutter 抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66093097/

相关文章:

flutter - 如何在 Flutter 后台使用 Android 摄像头?

flutter - 如何在 flutter 中使用 Telegram api 创建消息传递模块

csv - 在Flutter中读取CSV文件时没有此类文件

dart - 使用 Dart 解析 JSON 字符串时转换数据

Flutter:AppBar 形状(工具栏和应用栏背景不同的圆顶角)

firebase - 新增: '_InternalLinkedHashMap<String, dynamic>'类型不是 'DocumentSnapshot'类型的子类型

dart - Dart目录扫描和列表填充

发布应用程序中的 Flutter MissingPluginException(在 channel 上找不到方法 getAll 的实现...)

debugging - 如何在Flutter web中调试或打印?

dart - ng-模型到angulardart中的多重选择