Flutter CupertinoActionSheet: как определить переменное количество действий - PullRequest
0 голосов
/ 13 июля 2020

В зависимости от количества записей в List DifferentEmnen, я хотел бы показать переменное количество пунктов меню. Можно ли добиться чего-то подобного?

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 Ответ

0 голосов
/ 14 июля 2020

Вы можете скопировать и вставить полный код ниже
Шаг 1: Вы можете определить класс 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"),
      ),
    );
  }
}

полный код

...