首页 > 解决方案 > 在 Flutter 中访问类的元素

问题描述

我有一个带有“FoodIcon”类的单独屏幕,其中有一个正在调用它的列表:

class FoodIcon {
  String name;
  IconButton foodIcon;

  FoodIcon(this.name, this.foodIcon);

  List foods = [
    FoodIcon('Beef',
        IconButton(icon: Image.asset('assets/beef.png'), onPressed: null)),
    
  ];
}

现在我将如何在另一个屏幕(页面)上访问列表“食物”?例如,如果我在另一个屏幕上有一个容器:

Widget _buildIcon() {
return AlertDialog(
  title: Text('Add Icon'),
  content: Container(//For example how do I access elements of the list from another page here),

我导入了我希望访问它的页面上的 FoodIcon 类所在的页面,但是我将如何访问 List 和其中的元素?

添加了我需要的页面的完整代码:

 class FoodList extends StatefulWidget {
 


  @override
  _FoodListState createState() => _FoodListState();
}
class _FoodListState extends State<FoodList> {
  @override
  void initState() {
    super.initState();
    DatabaseProvider.db.getFoods().then(
      (foodList) {
        BlocProvider.of<FoodBloc>(context).add(SetFoods(foodList));
      },
    );
   
  }

  Widget _buildIcon() {
    return AlertDialog(
      title: Text('Add Icon'),
      //content ce da bude lista mozda mi treba row/column ovde sa svim ikonicama i imenima, gde ce kada se klikne ikonica
      //ontap biti setState da ikonica bude phIcon koji ce dole u ListTilu biti izabran i ocuvan dok se ne promeni, ali mora da bdue razlicit za svaki tile
      content: Container(),
      actions: [
        FlatButton(
          child: Text('Cancel'),
          onPressed: () => Navigator.pop(context),
        ),
      ],
    );
  }
  
  @override
  Widget build(BuildContext context) {
  
  return Container(
  child: //maybe display it here for show purposes)}

标签: flutterdart

解决方案


主页.dart:

    class Home extends StatefulWidget {
      @override
      _HomeState createState() => _HomeState();
    }
    
    class _HomeState extends State<Home> {
      @override
      Widget build(BuildContext context) {
        
    FoodIcon foodIcon = new FoodIcon(
      "Maaz Kamal",
      IconButton(
        icon: Image.asset('assets/beef.png'),
      ),
    ); 
    
// here i populated the list three times for the sake of the example.
        myList.add(foodIcon);
        myList.add(foodIcon);
        myList.add(foodIcon);
    
        return Scaffold(
          body: Container(
            child: Center(
              child: FlatButton(
                onPressed: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => MyNextPage(myList),
                      ));   // You can pass your list to next view like this
                },
                child: Text(
                  "Go to next page",
                  style: TextStyle(color: Colors.redAccent, fontSize: 30.0),
                ),
              ),
            ),
          ),
        );
      }
    }

MyNextPage.dart:

class MyNextPage extends StatefulWidget {
  List<FoodIcon> mySecondList;

  MyNextPage(this.mySecondList, {Key key}) : super(key: key); //getting the list from previous view

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

class _MyNextPageState extends State<MyNextPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: FlatButton(
          onPressed: () => showDialog(
            context: context,
            builder: (dialogContext) =>
                _buildIcon(dialogContext, widget.mySecondList), // using the list with widget.mySecondList and passing it to our Alert Method
          ),
          color: Colors.lightBlueAccent,
          child: Center(
            child: Text(
              "Click here to see List",
              style: TextStyle(fontSize: 40.0),
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildIcon(dialogContext, List<FoodIcon> mySecondList) {
    return AlertDialog(
      title: Text('Add Icon'),
      content: Container(
        width: 300.0,
        height: 300.0,
        child: ListView.builder(
          shrinkWrap: true,
          itemCount: mySecondList.length,
          itemBuilder: (context, index) => Column(
            children: <Widget>[
              Text(mySecondList[index].name),
              mySecondList[index].foodIcon
            ],
          ),
        ), //For example how do I access elements of the list from another page here),
      ),
    );
  }
}

推荐阅读