【问题标题】:how to get listview button to go to random route onTap如何让listview按钮转到随机路线onTap
【发布时间】:2020-08-12 02:14:02
【问题描述】:

我正在尝试使用此处的解决方案 How make button which open random page in Flutter? 但不是 RaisedButton,而是使用我的 Listview 按钮。

这是我从另一个 StackOverflow 添加 RandomRouteGenerator 后所拥有的:

ListView(
      children: const <Widget>[
        Card(
          child: ListTile(
            leading: Text('????'),
            title: Text('Chicken'),
            onTap: () {
              Navigator.of(context).pushNamed(
                RouteGenerator.getRandomNameOfRoute());
            },
          ),
        ),

//... more Cards that would become other listview items

以下是错误:

Compiler message:
lib/main.dart:163:28: Error: Not a constant expression.
              Navigator.of(context).pushNamed(
                           ^^^^^^^
lib/main.dart:163:25: Error: Method invocation is not a constant expression.
              Navigator.of(context).pushNamed(
                        ^^
lib/main.dart:164:32: Error: Method invocation is not a constant expression.
                RouteGenerator.getRandomNameOfRoute());
                               ^^^^^^^^^^^^^^^^^^^^
lib/main.dart:163:37: Error: Method invocation is not a constant expression.
              Navigator.of(context).pushNamed(
                                    ^^^^^^^^^
lib/main.dart:162:20: Error: Not a constant expression.
            onTap: () {
                   ^^

谢谢

【问题讨论】:

  • 嗨@Uni,我对此很陌生,所以我很抱歉不认识其中的一些术语。所以你是说我不能用 Listview 按钮去随机路线?
  • 如果你真的想实现你想要做的事情,试试这个:stackoverflow.com/questions/59766770/…

标签: flutter listview random


【解决方案1】:

您可以在下面复制粘贴运行完整代码
您可以删除关键字constchildren: const &lt;Widget&gt;[
代码sn-p

child: ListView(children: <Widget>[
            Card(

工作演示

完整代码

import 'dart:math';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Random pages',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: 'start_page',
      onGenerateRoute: RouteGenerator.generateRoute,
    );
  }
}

class RouteGenerator {
  static List<String> myRandomPages = ['first_page', 'second_page'];

  static String getRandomNameOfRoute() {
    return myRandomPages[Random().nextInt(myRandomPages.length)];
  }

  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case 'start_page':
        return MaterialPageRoute(builder: (_) => StartPage());

      case 'first_page':
        return MaterialPageRoute(
            builder: (_) =>
                FirstPage()); // FirstPage - is just a Widget with your content

      case 'second_page':
        return MaterialPageRoute(
            builder: (_) => SecondPage()); // Also custom Widget

      //... other random or not pages

    }
  }
}

class StartPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Start page'),
        ),
        body: Column(
          children: [
            Expanded(
              child: ListView(children: <Widget>[
                Card(
                  child: ListTile(
                    leading: Text('?'),
                    title: Text('Chicken'),
                    onTap: () {
                      Navigator.of(context)
                          .pushNamed(RouteGenerator.getRandomNameOfRoute());
                    },
                  ),
                ),
              ]),
            ),
            Center(
              child: RaisedButton(
                child: Text('Go to random page'),
                onPressed: () => Navigator.of(context)
                    .pushNamed(RouteGenerator.getRandomNameOfRoute()),
              ),
            ),
          ],
        ));
  }
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text("First Page");
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text("Second Page");
  }
}

【讨论】:

  • 感谢您提供我做错的地方、完整代码以及最终产品的外观。这对我来说很有教育意义。如果你有时间,你能解释一下为什么在 ListView 中保留“const”会给我带来这样的麻烦吗?
  • 你可以参考这个medium.com/@jelenaaa.lecic/…
【解决方案2】:

尝试删除 ListView 子级上的 const

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多