【问题标题】:How to add Navigation to a List of elements in Flutter如何将导航添加到 Flutter 中的元素列表
【发布时间】:2020-12-26 09:29:20
【问题描述】:

我有一个名为 Categories

的模型类
class Categories {  //Categories class
  final String route;
  final String categoryName;
  final String categorySubTitle;
  Categories({this.route, this.categoryName, this.categorySubTitle});
}

我创建了一个列表,其中放置了我创建的类的所有对象。

List<Categories> categories = [tarocchi, sogni]; //List of categories

final Categories tarocchi = Categories(
  route: '/tarocchi',
  categoryName: 'Tarocchi e Divinazione',
  categorySubTitle: 'L’antica arte dei Tarocchi e della Divinazione',
);
final Categories sogni = Categories(
  route: '/sogni',
  categoryName: 'Interpretazione dei Sogni',
  categorySubTitle: 'Significato e interpretazione dei Sogni',
);

列表中的每个项目都必须转到不同的屏幕。 在我生成的列表中,会有一个 onTap 函数会推送到不同的屏幕:

ListView.builder(
        itemCount: categories.length,
        itemBuilder: (context, index) {
          return Column(
            children: [
              GestureDetector(
                onTap: () => Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => Text(categories[index].categorySubTitle)
                      // here I call the new screens according with screens in the List
                      ),
                ),
                child: Card(
                  child: Text(categories[index].categoryName),
                ),
              )
            ],
          );
        },
      ),

【问题讨论】:

  • 我想请你分享一下屏幕设计以了解问题的全貌,但我更喜欢使用 Widget 而不是 Route,所以你可以将 Widgets 预设为片段。跨度>
  • nono 你不知道谁在谈论长度?我需要使用该类并为列表中的不同项目指定不同的屏幕...
  • categories 是一个 List 所以可以得到 .length @Agkab,最好只为所有类别创建一个屏幕,并简单地将在此屏幕上渲染所需的类别数据传递给类的构造函数。
  • @lordvidex 谢谢,他刚刚修改了。这不是相同的代码。代码已编辑。

标签: flutter listview dart navigation


【解决方案1】:

试试这个:

import 'package:flutter/material.dart';
void main() => runApp(MyApp()); // main function 

class MyApp extends StatelessWidget {  // MyApp class
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      initialRoute: '/home',
      routes: {
        '/home': (context) => Home(),
        categories[0].route: (context) => Scaffold(
            appBar: AppBar(title: Text(categories[0].categoryName)),
            body: Text(categories[0].categorySubTitle)),  //first route
        categories[1].route: (context) => Scaffold(
            appBar: AppBar(title: Text(categories[1].categoryName)),
            body: Text(categories[1].categorySubTitle)),  // second route
      },
    //Here to simplify things, you can create a variable of type Map<String,
    // Widget Function(BuildContext)> and then assign it to route
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Material App Bar'),
      ),
      body: ListView.builder(
        itemCount: categories.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(categories[index].categoryName),
            subtitle: Text(categories[index].categoryName),
            onTap: () =>
                Navigator.pushNamed(context , categories[index].route),
          );
        },
      ),
    );
  }
}

class Categories {  //Categories class
  final String route;
  final String categoryName;
  final String categorySubTitle;
  Categories({this.route, this.categoryName, this.categorySubTitle});
}

final Categories tarocchi = Categories(
  route: '/tarocchi',
  categoryName: 'Tarocchi e Divinazione',
  categorySubTitle: 'L’antica arte dei Tarocchi e della Divinazione',
);
final Categories sogni = Categories(
  route: '/sogni',
  categoryName: 'Interpretazione dei Sogni',
  categorySubTitle: 'Significato e interpretazione dei Sogni',
);

List<Categories> categories = [tarocchi, sogni]; //List of categories

我认为这就是您要寻找的。你可以以此为基础 其余的。

【讨论】:

    【解决方案2】:

    您应该使用Named Route。您应该为所有屏幕创建名称路由 例子: 在 MaterialApp 中

    MaterialApp(
      title: 'My App',
      initialRoute: '/home',
      routes: {'home': (BuildContext context) => HomeScreen(),
                'settings': (BuildContext context) => SettingsScreen(),
        },
     ),
    

    在您的ListViewBuilder 中更改您的onTap 像这样

    () => Navigator.pushNamed(context, 'home'); // 'home' should be same as key that you give in `routes` in `MaterialApp`
    

    这将解决问题。

    像这样创建category数组,

    final Categories tarocchi = Categories(
        id: 1,
        categoryName: 'Tarocchi e Divinazione',
        categoryImage: 'assets/images/tarot.jpg',
        categorySubTitle: 'L’antica arte dei Tarocchi e della Divinazione',
        categoryDescription: 'L’antica arte dei Tarocchi e della Divinazione',
        categoryRoute: 'home'
    
    );
    final Categories sogni = Categories(
        id: 2,
        categoryName: 'Interpretazione dei Sogni',
        categoryImage: 'assets/images/dreams.jpg',
        categorySubTitle: 'Significato e interpretazione dei Sogni',
        categoryDescription: 'Significato e interpretazione dei Sogni'
        categoryRoute: 'settings'
    
    );
    
    List<Categories> categories = [tarocchi, sogni,aromaterapia,cristalloterapia,naturopatia,ascolto,sciamanesimo,regressioni];
    

    【讨论】:

    • 我觉得这里漏掉了一块,还有Categories 类?如上所示,分类类中的每个元素都有一个不同的屏幕...在分类列表的每个元素中使用什么来移动到正确的屏幕?
    • Hai Agos Dev,请参考编辑后的答案,我添加了类别数组
    • with: Navigator.pushNamed(context, 'home');列表的所有元素都推送到同一个屏幕我那里需要列表的索引。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多