【问题标题】:Flutter - using onTap with a list callFlutter - 将 onTap 与列表调用一起使用
【发布时间】:2021-05-16 10:37:06
【问题描述】:

我知道的一些杂乱无章的代码。

尝试使用 categoriesList 让 onTap 切换到另一个页面,但收到“返回类型 'String' 不是 'Widget',如闭包上下文所要求的那样”的错误。不完全确定下一个代码应该在这里。

List<Category> categoriesList = [
  Category(name: "nameA", image: "imageA.png", page: "page1"),
  Category(name: "nameB", image: "imageB.png", page: "page2"),
  Category(name: "nameC", image: "imageC.png", page: "page3"),
  Category(name: "nameD", image: "imageD.png", page: "page4"),
  Category(name: "nameE", image: "imageE.png", page: "page5"),
  Category(name: "nameF", image: "imageF.png", page: "page6"),
];

child: Padding(
                            padding: EdgeInsets.all(4.0),
                            child: GestureDetector(
                              onTap: (){
                                Navigator.push(
                                    context,
                                    MaterialPageRoute(
                                    builder: (context) => categoriesList[index].page));
                              },
                              child: Image.asset(
                                "assets/images/${categoriesList[index].image}",
                                width: 100,
                                height: 100,
                              ),
                            ),
                          ),

Main.dart 文件

import 'package:app/screens/page1.dart';
import 'package:app/screens/page2.dart';
import 'package:app/screens/home.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => page1(),
        '/second' : (context) => page2(),
      },
      title: 'My App',
      theme: ThemeData(appBarTheme: AppBarTheme(color:Colors.blue, centerTitle: true)
      ),
      home: Home(),
      debugShowCheckedModeBanner: false,
    );
  }
}

【问题讨论】:

    标签: flutter


    【解决方案1】:

    问题是,你传递的是一个字符串,而你应该传递一个小部件:

                                Navigator.push(
                                    context,
                                    MaterialPageRoute(
                                    builder: (context) => categoriesList[index].page1));
    

    builder: (context) => categoriesList[index].page1));

    这里的 Builder 需要一个 Widget,例如MyPage1(categoriesList[index]) 而不是字符串。 如果您想导航,使用字符串作为 RouteName,您应该使用类似于

      Navigator.pushNamed(
         context,
         categoriesList[index].page);
    

    您列表中的名称必须与您的 main.dart 中的路线相匹配,例如:

    你的清单

      Category(name: "nameA", image: "imageA.png", page: "/page1"),
      Category(name: "nameB", image: "imageB.png", page: "/page2"),
      Category(name: "nameC", image: "imageC.png", page: "/page3"),
      ...
    

    还有你在 main.dart 中的路由

          routes: {
    ...
        '/page1': (context) => page1(),
        '/page2' : (context) => page2(),
        '/page3':(context) => page3(),...
      },
    

    【讨论】:

    • 抱歉,没有更改一些复制的代码。该问题已使用正确的代码进行编辑。并非每张图片都进入第 1 页。对此感到抱歉。
    • 所以只是为了确保我做对了:名称和图像仅用于此页面上的显示,导航所需的只是页面名称。 page1, page2, page3 是您的导航器中指定的路由名称?
    • 正确。当你按下 imageA 时,它会带你到 page1,等等。
    • 在这种情况下,您可以使用我刚刚更新的第二个 Codesn-p 中的“Navigator.pushNamed(..”。
    • 只需要在main.dart文件的routes中添加page1page2等页面,除非你用相应的widget注册名字,否则你将无法使用它们进行导航。另外,page1 是以/ 作为名称注册的,而不是page1 作为名称
    猜你喜欢
    • 2021-05-03
    • 2018-01-17
    • 1970-01-01
    • 2022-01-11
    • 2020-12-19
    • 1970-01-01
    • 2017-09-07
    • 2013-10-13
    • 2012-03-23
    相关资源
    最近更新 更多