Flutter CupertinoActionSheet:如何定义可变数量的动作

Flutter CupertinoActionSheet: how to define Variable number of actions

取决于 List distinctEmnen 中的条目数, 我想显示可变数量的菜单选项。 是否有可能实现这样的目标?

CupertinoActionSheet(
              title: Text( tjo),
              actions: [
                  CupertinoActionSheetAction(
                      child: Text( distinctEmnen[0]),
                        Navigator.of(context).pushNamed(distinctEmnen[0]);
                      }),
                  CupertinoActionSheetAction(
                      child: Text( distinctEmnen[1]),
                      onPressed: () { 
                        Navigator.of(context).pushNamed(distinctEmnen[1]);
                      }),

                  CupertinoActionSheetAction(
                      child: Text( distinctEmnen[n...]),
                      onPressed: () { 
                        Navigator.of(context).pushNamed(distinctEmnen[n...]);
                      }),

              ],
              cancelButton: CupertinoActionSheetAction(
                child: Text('Cancel'),
                onPressed: () => Navigator.of(context).pop(),
              ),
            ),

您可以复制粘贴运行下面的完整代码
第 1 步:您可以定义一个 class Emnen
第 2 步:初始化 List<Emnen> distinctEmnen
第 3 步:使用 List<Widget>.generate(distinctEmnen.length,

代码片段

class Emnen {
  String title;
  String routeName;

  Emnen({this.title, this.routeName});
}
...
List<Emnen> distinctEmnen = [];
...
  @override
  void initState() {
    distinctEmnen = [
      Emnen(title: "1", routeName: "/1"),
      Emnen(title: "2", routeName: "/2")
    ];
    super.initState();
  }
...  
CupertinoActionSheet(
      title: Text("tjo"),
      actions: List<Widget>.generate(
          distinctEmnen.length,
          (int index) => CupertinoActionSheetAction(
              child: Text(distinctEmnen[index].title),
              onPressed: () => Navigator.of(context)
                  .pushNamed(distinctEmnen[index].routeName))));

工作演示

完整代码

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

class Emnen {
  String title;
  String routeName;

  Emnen({this.title, this.routeName});
}

class CupertinoActionSheetApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) => CupertinoApp(
        initialRoute: "/",
        routes: {
          '/': (context) => HomePage(),
          '/1': (context) => FirstScreen(),
          '/2': (context) => SecondScreen(),
        },
      );
}

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

class _HomePageState extends State<HomePage> {
  List<Emnen> distinctEmnen = [];

  @override
  void initState() {
    distinctEmnen = [
      Emnen(title: "1", routeName: "/1"),
      Emnen(title: "2", routeName: "/2")
    ];
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: CupertinoButton(
          child: Text("show dialog"),
          onPressed: () {
            _showDialog(context);
          }),
    );
  }

  void _showDialog(BuildContext cxt) {
    showCupertinoModalPopup<int>(
        context: cxt,
        builder: (cxt) {
          var dialog = CupertinoActionSheet(
              title: Text("tjo"),
              actions: List<Widget>.generate(
                  distinctEmnen.length,
                  (int index) => CupertinoActionSheetAction(
                      child: Text(distinctEmnen[index].title),
                      onPressed: () => Navigator.of(context)
                          .pushNamed(distinctEmnen[index].routeName))));

          return dialog;
        });
  }
}

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

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(
        middle: Text("Cupertino App"),
      ),
      child: Center(
        child: Text("First"),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(
        middle: Text("Cupertino App"),
      ),
      child: Center(
        child: Text("Second"),
      ),
    );
  }
}

完整代码