如何解决Flutter中的路线问题?

py49o6xq  于 2023-01-09  发布在  Flutter
关注(0)|答案(1)|浏览(111)

晚上好。我目前正在Flutter中做一个待办事项列表,我想在我点击一个新屏幕时传递我的列表标题和列表描述,但是在设置路由并在我的下一个上声明值时,它在我设置的路由上显示“期望2个位置参数,但找到0个”。以下是我的代码:
这是我的第一个屏幕:

import 'package:flutter/material.dart';
import 'package:todo_list/details.dart';
import 'package:todo_list/note.dart';

class MyApp extends StatelessWidget {
  final String text;
  final int number;
  final String listDescription;

  const MyApp(
      {super.key,
      required this.text,
      required this.number,
      required this.listDescription});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        DetailsPage.routeName: (ctx) => DetailsPage(),
      },
      home: CustomListTile(
        text: text,
        number: number,
        listDescription: listDescription,
      ),
    );
  }
}

class CustomListTile extends StatelessWidget {
  final String text;
  final int number;
  final String listDescription;

  const CustomListTile(
      {super.key,
      required this.text,
      required this.number,
      required this.listDescription});

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        Navigator.pushNamed(context, DetailsPage.routeName,
            arguments: Note(title: text, description: listDescription));
      },
      /* onTap: () {
        Widget okButton = TextButton(
          child: const Text("CLOSE"),
          onPressed: () {
            Navigator.of(context).pop();
          },
        );

        AlertDialog alert = AlertDialog(
            title: Text(text),
            content: Text('This item in the list contains $listDescription'),
            actions: [
              okButton,
            ]);
        showDialog(
            context: context,
            builder: (BuildContext context) {
              return alert;
            });
      }, */

      child: Padding(
        padding: const EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text("$number. $text",
                    style: const TextStyle(
                      fontSize: 20,
                    )),
                const Icon(Icons.chevron_right)
              ],
            ),
            Text(
              listDescription,
              style: const TextStyle(fontSize: 14, color: Colors.grey),
            ),
            const Divider()
          ],
        ),
      ),
    );
  }
}

这是我的第二个屏幕:

import 'package:flutter/material.dart';

import 'note.dart';

class DetailsPage extends StatefulWidget {
  static const String routeName = "/details";
  final String text;
  final String listDescription;

  const DetailsPage(this.text, this.listDescription, {super.key});

 @override
  State<DetailsPage> createState() => _DetailsPageState();
}
class _DetailsPageState extends State<DetailsPage> {
 late Note params;
  @override
  void didChangeDependencies() {
    params = ModalRoute.of(context)!.settings.arguments! as Note;
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    Widget titleSection = Container(
      padding: const EdgeInsets.all(32),
      child: Row(
        children: [
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Container(
                  padding: const EdgeInsets.only(bottom: 0),
                  child: Text(
                    params.title,
                    style: const TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 25,
                    ),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );

    Color color = Theme.of(context).primaryColor;

    Widget buttonSection = Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        _buildButtonColumn(
          color,
          Icons.edit,
          'EDIT',
        ),
        _buildButtonColumn(color, Icons.delete, 'DELETE'),
      ],
    );

    Widget textSection = Padding(
      padding: const EdgeInsets.all(20),
      child: Text(
        params.description,
        softWrap: true,
      ),
    );

    return MaterialApp(
      title: 'Layout for a New Screen',
      theme: ThemeData(
        primarySwatch: Colors.brown,
      ),
      home: Scaffold(
        appBar: AppBar(
          leading: IconButton(
            icon: const Icon(Icons.arrow_back),
            onPressed: () {
              Navigator.pop(context);
            },
          ),
          title: Text(params.title),
        ),
        body: ListView(
          children: [
            Image.asset(
              'lib/images/placeholder.jpg',
              width: 600,
              height: 240,
              fit: BoxFit.cover,
            ),
            titleSection,
            buttonSection,
            textSection,
          ],
        ),
      ),
    );
  }

  Column _buildButtonColumn(
    Color color,
    IconData icon,
    String label,
  ) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Icon(icon, color: color),
        Container(
          margin: const EdgeInsets.only(top: 8),
          child: Text(
            label,
            style: TextStyle(
              fontSize: 12,
              fontWeight: FontWeight.w400,
              color: color,
            ),
          ),
        ),
      ],
    );
  }
}

    /* return Scaffold(
        appBar: AppBar(title: Text(text)),
        body: Center(
          child: Row(
            children: [Text(description)],
          ),
        ));
  }
} */

我怎样才能让我传递的数据,如标题和描述,出现在第二个屏幕上,而不会出现错误“2个位置参数预期,但0找到。尝试添加丢失的参数。”
我尝试了VS代码上的快速修复,比如添加一个常量修饰符,但我认为常量修饰符不会做修复,因为我试图传递的两个数据都是动态的,可能会不时更改。

q35jwt9p

q35jwt9p1#

在您定义详细信息页面时

class DetailsPage extends StatefulWidget {
  static const String routeName = "/details";
  final String text;
  final String listDescription;

  const DetailsPage(this.text, this.listDescription, {super.key});

需要传递两个字符串作为位置参数。
所以它可以

routes: {
  DetailsPage.routeName: (ctx) => DetailsPage("text","description"),
},

同样,当你使用路由参数时,你可以从widget类中删除这些参数,而只使用ModalRoute从状态类上下文中接受。
您可以选中this exampledevelopment/ui/navigation

相关问题