Flutter中页面之间动态添加数据

Posted

技术标签:

【中文标题】Flutter中页面之间动态添加数据【英文标题】:Dynamically adding data between pages in Flutter 【发布时间】:2020-11-21 06:30:20 【问题描述】:

第一页

所以我想将这个 ListTile 发送到另一个页面,我们将其称为“购物车”页面以进行演示。它位于第一页的单独函数中,位于构建器上方,稍后在构建器中作为函数调用。这是它的代码:

return ListTile(
                  trailing: Container(
                    padding: EdgeInsets.only(top: 15.0),
                    child: IconButton(
                        icon: Icon(Icons.add),
                       
                        onPressed: () => MaterialPageRoute(
                              this i am not sure how to access cart page
                              builder: (context) =>
                                  Cart(food.name, food.price),
                            )),
                  ),

注意 onPressed 上没有 Navigator.push(),因为我只想将数据发送到购物车页面。

这是将数据发送到另一个页面上的“购物车”屏幕的功能,它可以工作。我遇到的问题是我还希望在 AppBar 上(在构建器下方)上有一个按钮,该按钮只进入该页面而不传递任何数据(上面的图标应该只传递数据 onPressed,它是第一页上的 ListTile 项.)

这是第一页 AppBar 图标的代码:

return Scaffold( 
appBar: AppBar(
        actions: [
          IconButton(
            icon: Icon(Icons.add_shopping_cart, color: Colors.white),
           
            onPressed: () => print('This needs to lead to cart page.'),
            //I tried doing the Navigator.push route, but it asks for arguments, but I just want
            //to go to the page and not pass any arguments from here
            //this needs to lead to cart page
          ),
        ],)

购物车页面

这是应该推送数据的“购物车”页面,理想情况下,我只想将该 ListTile 项目添加到购物车中,作为与第 1 页相同的列表图块。

 class Cart extends StatefulWidget 
  
  
  final String foodName;
  final String foodPrice;
  Cart(this.foodName, this.foodPrice);

  @override
  _CartState createState() => _CartState();


class _CartState extends State<Cart> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text('Cart'),
        centerTitle: true,
      ),
      body: Center(
          child: Container(
              child: Text('$widget.foodName, $widget.foodPrice'))),
    );
  

问题是我想对食物有不同的选择,有时会添加例如“food.description”或类似的东西,甚至是像“drink.name”这样的不同类。这是我关于这个问题的精彩画图演示。

【问题讨论】:

可能,使用本地存储对你来说是个不错的选择.. 您应该为购物车创建一个模型类,在购物车页面中,您可以使用名称参数 Cart(this.foodName, this.foodPrice); . 【参考方案1】:

您应该为此使用状态管理包。 Provider、Bloc、Redux 等。当用户按下 Add 按钮时。您可以将数据添加到主源并使用这些包通知侦听器。这里有一个 Provider 包的例子:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class CartItemsModel extends ChangeNotifier 
  List<String> _cartItems = [];

  List<String> get cartItems => _cartItems;

  addCartItem(String item) 
    _cartItems.add(item);
    notifyListeners();
  


class MainPage extends StatelessWidget 
  const MainPage(Key key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Provider(
      create: (c) => CartItemsModel(),
      child: MaterialApp(
        home: Consumer<CartItemsModel>(
          builder: (c, model, _) => Scaffold(
            appBar: AppBar(
              actions: [
                IconButton(
                  icon: Column(
                    children: [
                      Icon(Icons.add_shopping_cart_rounded),
                      Text('added items' + model.cartItems.length.toString()),
                    ],
                  ),
                  onPressed: () 
                    Navigator.of(context).push(MaterialPageRoute(
                      builder: (c) => SecondPage(),
                    ));
                  ,
                ),
              ],
            ),
            body: Column(
              children: [
                Text('CartItems Length:' + model.cartItems.length.toString()),
                RaisedButton(
                  onPressed: () 
                    model.addCartItem('Example Cart Item');
                  ,
                  child: Text('ADD ITEM'),
                ),
                RaisedButton(
                  onPressed: () 
                    Navigator.of(context).push(MaterialPageRoute(
                      builder: (c) => SecondPage(),
                    ));
                  ,
                  child: Text('Go another page'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  


class SecondPage extends StatelessWidget 
  const SecondPage(Key key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Consumer<CartItemsModel>(
      builder: (c, model, _) => Scaffold(
        body: Column(
          children: model.cartItems
              .map((e) => ListTile(
                    title: Text(e),
                  ))
              .toList(),
        ),
      ),
    );
  

在您的 main 函数中运行此应用,看看它是如何工作的。当您按下添加项目按钮时,它会将“示例购物车项目”添加到提供者类的列表中,并且提供者类将通知其他侦听器更新其状态。 欲了解更多信息: https://pub.dev/packages/provider

【讨论】:

以上是关于Flutter中页面之间动态添加数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何调用本地 JSON 数据并动态添加到标签栏?

Flutter - 在无状态小部件中动态地将项目添加到 ListView

在 Flutter 中跨页面移动数据

Flutter Dio 将 Multipart File 对象动态添加到 Map

在 Flutter 中动态显示数据表布局中的 JSON 数据

Flutter - 从 websocket 消息动态创建小部件 - 未处理的异常:在构造函数中调用 setState()