【问题标题】:Navigate to another page from ListTile从 ListTile 导航到另一个页面
【发布时间】:2020-07-27 09:55:00
【问题描述】:

我的应用程序有一个包含多个条目的可扩展列表。我想通过单击最低级别的 ListTiles 导航到不同的页面。我知道有 'onTap' 方法,但它需要一个 buildContext,我没有我编写它的方式。 我从网上获得了代码并对其进行了一些修改。代码如下:

import 'package:flutter/material.dart';
import '../screens/model_view_screen.dart';
import '../models/entry.dart';

class EntryItem extends StatelessWidget {
  const EntryItem(this.entry);
  final Entry entry;

  Widget _buildTiles(Entry root) {
    if (root.children.isEmpty) {
      return Padding(
        padding: const EdgeInsets.all(10.0),
        child: Container(
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(15),
            border: Border.all(
              width: 2,
              color: Color.fromRGBO(3, 120, 163, 1),
            ),
          ),
          child: ListTile(
            leading: Image.asset(root.imageUrl),
            title: Text(root.title),
            onTap: () {},
          ),
        ),
      );
    }
    return Padding(
      padding: const EdgeInsets.all(10.0),
      child: Container(
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(15),
          border: Border.all(
            width: 3,
            color: Color.fromRGBO(3, 120, 163, 1),
          ),
        ),
        child: ExpansionTile(
          key: PageStorageKey<Entry>(root),
          leading: Image.asset(root.imageUrl),
          title: Text(root.title, style: TextStyle(color: Colors.black)),
          children: root.children.map<Widget>(_buildTiles).toList(),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return _buildTiles(entry);
  }
}

目的地的路线名称在列表中给出:

class Entry{
  final String title;
  final String imageUrl;
  final String routeName;
  final List<Entry> children;

  Entry(this.title, this.imageUrl, this.routeName, [this.children = const <Entry>[]]);
}

提前谢谢你。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您想将BuildContext 传递给_buildTiles:

      Widget _buildTiles(BuildContext context, Entry root) {
      ....
              child: ListTile(
                leading: Image.asset(root.imageUrl),
                title: Text(root.title),
                onTap: () => Navigator.of(context).pushNamed(root.routeName),
              ),
      ....
              children: root.children.map((e) => _buildTiles(context, e)).toList(),
      ....
    
      @override
      Widget build(BuildContext context) {
        return _buildTiles(context, entry);
      }
    

    【讨论】:

    • 我已经尝试过该解决方案,但是当我这样做时,我收到以下错误:'参数类型'Widget Function(BuildContext,Entry)'不能分配给参数类型'Widget Function(Entry )'.dart(argument_type_not_assignable)' eroor 在这一行的 '_buildTiles' 处被标记: children: root.children.map(_buildTiles).toList(),
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2021-08-19
    • 2021-09-08
    相关资源
    最近更新 更多