当Flutter上的RaisedButton的文本更改时,如何将一个列表中的项目从一个类添加到另一个列表中

时间:2020-09-18 18:39:06

标签: flutter dart

我将屏幕分成若干块,并在首页中添加了一系列项目,我的listView是使用JSON构建listview的项目。 加高按钮以“ iniciar”开头,意思是“开始”,当我单击RaisedButton时,它转到“ Finalizar”(表示完成)。发生这种情况时,我想将此特定项目添加到第二个屏幕中。我在屏幕上贴了一张图片。

ListView:

class ProdutoListView extends StatefulWidget {
  List<Produto> produtos;
  List<Produto> startProd;

  ProdutoListView(this.produtos);

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

class _ProdutoListViewState extends State<ProdutoListView> {
  Timer _timer;

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      shrinkWrap: true,
      itemCount: widget.produtos.length,
      itemBuilder: (BuildContext context, int index) {
        return makeCard(index, context);
      },
    );
  }

  Card makeCard(int index, context) {
    Produto prod = widget.produtos[index];
    return Card(
      child: Container(
        color: Colors.black,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Container(
              //   child: prod.tempo > 10 ? color: Colors.red, : color: Colors.white,
              color: Colors.white,
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    Flexible(
                      child: Text(
                        "Comanda:" + prod.comanda,
                        style: TextStyle(fontSize: 22),
                      ),
                    ),
                    Flexible(
                      child: Text(
                        "Mesa:" + prod.mesa,
                        overflow: TextOverflow.ellipsis,
                        style: TextStyle(fontSize: 22),
                      ),
                    )
                  ],
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(16.0),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.start,
                children: [
                  Expanded(
                    flex: 50,
                    child: Text(
                      ">" + prod.qntd,
                      style: TextStyle(fontSize: 20, color: Colors.white),
                    ),
                  ),
                  Expanded(
                    flex: 50,
                    child: Text(
                      prod.produto,
                      style: TextStyle(fontSize: 26, color: Colors.white),
                    ),
                  )
                ],
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(16.0),
              child: Container(
                margin: EdgeInsets.only(left: 30),
                child: Text(
                  prod.observacao,
                  style: TextStyle(fontSize: 20, color: Colors.white),
                ),
              ),
            ),
            Container(
              color: Colors.black12,
              child: Padding(
                padding: const EdgeInsets.all(5.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    RaisedButton(
                        child: Text(
                          prod.estado,
                          style: TextStyle(color: Colors.black),
                        ),
                        color: Colors.white,
                        onPressed: () {
                          _initialize(context, prod);
                          Produto startProd = widget.produtos[index];
                          startProd = prod;
                          print("produto iniciado: $startProd[]");
                        }),
                    Flexible(
                      child: Text(
                        "Tempo: " + prod.tempo.toString(),
                        overflow: TextOverflow.ellipsis,
                        style: TextStyle(fontSize: 16, color: Colors.red),
                      ),
                    )
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  void _startTimer(prod) {
    prod.tempo = 0;
    if (_timer != null) {
      _timer.cancel();
    }
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      setState(() {
        if (prod.estado == "Finalizar") {
          prod.tempo++;
          //_add(prod);
        } else {
          _timer.cancel();
        }
      });
    });
  }

  _initialize(context, prod) {
    setState(() {
      prod.estado = "Finalizar";
    });
    _startTimer(prod);
  }
}

首页:

[class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<Produto> produto;
  List<Produto> startProd;

  final _bloc = ProdutoBloc();
  final produtoiniciado = ProdutoBloc();

  @override
  void initState() {
    super.initState();
    _bloc.listarProdutos();
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: \[
        SizedBox(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width / 2,
          child: _getData(),
          //child: _tamanhoProdutoList(context),
          //child: _tamanhoProdutoList(context),
        ),
        SizedBox(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width / 2,
          child: _getPedidosIniciados(),
        ),
      \],
    );
  }

  _getPedidosIniciados() {
    return StreamBuilder(builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return Material(
          color: Colors.white,
          child: Center(
            child: Text("Nenhum pedido foi iniciado"),
          ),
        );
      }
      return RefreshIndicator(
        onRefresh: _onRefresh,
        child: ProdutoListView(
          startProd,
        ),
      );
    });
  }

  StreamBuilder<List<Produto>> _getData() {
    return StreamBuilder(
        stream: _bloc.stream,
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return TextError("Não foi possivel buscar os dados!");
          }
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          produto = snapshot.data;
          return RefreshIndicator(
            onRefresh: _onRefresh,
            child: ProdutoListView(
              produto,
            ),
          );
        });
  }

  Future<void> _onRefresh() {
    return _bloc.listarProdutos();
  }

1 个答案:

答案 0 :(得分:0)

ProdutoBloc()有什么用? 好吧,因为似乎您已经使用BLOC了,您可以使用它来进行管理,创建一个可以接收产品并产生产品清单的集团。 像这样:

免责声明:我实际上并没有尝试只是为了给出想法的代码

class ProdutoListBloc extends Bloc<Produto, List<Produto>> {
  ProdutoListBloc(List<Produto> initialState) : super(initialState);

  @override
  List<Produto> get initialState => new List<Produto>();

  List<Produto> produtos = new List<Produto>();
  @override
  Stream<Produto> mapEventToState(
      Produto produto,
      ) async* {
    produtos.add(produto);
    yield produtos;
  }
}

当您按下Iniciar时,会将产品发送到集团。

BlocProvider.of<ProdutoListBloc>(context).add(produto);

另一方面,使用BlocBuilder构建_getPedidosIniciados(),以接收更新的产品列表。如果您需要淘汰产品,则可以详细说明此概念,也许可以创建一个带有变量的事件类,该变量说明是否必须添加或删除产品,等等。