Flutter - 对话框启动新活动

3
我正在开发一款计分应用程序,用于在创建团队后计算得分。在创建团队后,会弹出一个AlertDialog并显示名称。然后,应该可以点击按钮打开新活动。该活动不应与以前的活动相连。有人有想法吗?如何实现?
以下是对话框活动的代码片段:
import 'dart:math';
import 'package:flutter/material.dart';

import 'punktezaehler.dart';

class Team_Dialog extends StatefulWidget{

  final List<String> team_namen;

  Team_Dialog(this.team_namen);

  @override
  State<StatefulWidget> createState() => new _TeamDialogState(team_namen);

}

class _TeamDialogState extends State<Team_Dialog>{

  final List<String> team_namen;
  _TeamDialogState(this.team_namen);

  @override
  Widget build(BuildContext context) {
    return new AlertDialog(
      content: new SingleChildScrollView(
        child: new ListBody(
            children: List.generate(1, (index){
              return Column(
                children: <Widget>[
                  new Row(
                    children: <Widget>[
                      Text("Team 1: ", style: TextStyle(fontFamily: "Roboto")),
                      Text(team_namen[0] + " und " + team_namen[1])
                    ],
                  ),
                  new Row(
                    children: <Widget>[
                      Text("Team 2: "),
                      Text(team_namen[2] + " und " + team_namen[3])
                    ],
                  )
                ],
              );
            })
        ),
      ),
      actions: <Widget>[
        new FlatButton(
            color: Colors.red,
            splashColor: Colors.red[900],
            onPressed: (){
              Navigator.of(context).pop();
            },
            child: new Text("Abort", style: TextStyle(color: Colors.white),)
        ),
        new IconButton(
            icon: Icon(Icons.shuffle),
            onPressed: (){
              shuffle(team_namen);
              setState(() {
              });
            }
        ),
        new FlatButton(
            color: Colors.green,
            splashColor: Colors.green[800],
            onPressed: () => , //After click it should start new Activity
            child: new Text("Start Game", style: TextStyle(color:  Colors.white))
        )
      ],
    );
  }



  List shuffle(List items) {
    var random = new Random();

    for (var i = items.length - 1; i > 0; i--) {

      var n = random.nextInt(i + 1);

      var temp = items[i];
      items[i] = items[n];
      items[n] = temp;
    }

    return items;
  }


}

如果有人有好的想法,那将会非常棒:D

你能否编写代码,在调用对话框时接收数据的位置? - diegoveloper
2个回答

5
实际上,当你谈论Flutter时,应该考虑页面而不是活动(Activity)。类似于这样的内容:
Navigator.push(context,
   MaterialPageRoute(builder: (context) => SecondScreen()),);

SecondScreen是另一个小部件,具有自己的Widget build(BuildContext context)方法,在其中您将声明此页面上要显示的内容。

如果您想返回上一页,则可以使用以下方式:

 Navigator.pop(context);

来源 文档

你也可以使用命名路由进行导航。例如:

MaterialApp(
  // Start the app with the "/" named route. In our case, the app will start
  // on the FirstScreen Widget
  initialRoute: '/',
  routes: {
    // When we navigate to the "/" route, build the FirstScreen Widget
    '/': (context) => FirstScreen(),
    // When we navigate to the "/second" route, build the SecondScreen Widget
    '/second': (context) => SecondScreen(),
  },
);

And something like:

Navigator.pushNamed(context, '/second');

Documentation


但是在新屏幕上删除“返回”按钮是否可能,以便我可以制作自定义按钮? - user9047282
是的,你可以这样做,你可以使用任何你想要的东西,唯一的限制是将它挂在一个动作上,比如onPressed等。 - speedyGonzales
1
我自己找到了解决方法,但还是谢谢你的建议。我所需要做的就是在AppBar中添加“automaticallyImplyLeading: false”。 - user9047282

1

使用Navigator.push()或者Navigator.pushNamed()并移除返回按钮不是一个好的实践,因为你离开的页面会继续留在页面堆栈中。

如果你不希望用户能够返回到前一页,实际上应该使用Navigator.pushReplacement()

如果你正在从对话框中进行操作,你应该关闭对话框进入下一页


为什么在应用程序中持有已访问页面的堆栈不是一个好习惯?这里潜在的问题是什么?实际上,当您使用Navigator.pushReplacement()时,动画和应用栏上的返回图标存在一些问题。 - speedyGonzales
1
如果您不再需要一个页面(即,如果您不希望用户能够返回到先前的屏幕),则应使用pushReplacement函数。它会从导航堆栈中删除当前页面并推送新页面。例如,当用户登录您的应用程序后,您会在登录后显示应用程序的主屏幕,并且您不希望用户通过按返回按钮返回到登录屏幕。 - Javid Noutash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接