Flutter: неопределенное имя 'context'
В настоящее время я пишу приложение, и у меня возникли проблемы с пейджер-маршрутизацией. Я использую RouteGenerator, который отлично работает, кроме этого случая. Если я пытаюсь перейти ко второму экрану, я получаю сообщение об ошибке: «Неопределенное имя« контекст ». Попробуйте изменить имя на то, которое определено, или определите имя».
Буду признателен, если кто-нибудь поможет мне с этим :)
Вот мой код (класс проекта находится в другом файле):
import 'package:flutter/material.dart';
class ProjectCard extends StatefulWidget {
const ProjectCard({
Key? key,
required this.project,
}) : super(key: key);
final Project project;
@override
_ProjectCardState createState() => _ProjectCardState();
}
class _ProjectCardState extends State<ProjectCard> {
// ignore: non_constant_identifier_names
List<Project> demo_projects = [];
@override
void initState() {
super.initState();
demo_projects.add(Project(title: 'Test', description: 'Test', onTap: () {Navigator.pushNamed(context, '/second');}),);
}
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {},
child: Container(
decoration: BoxDecoration(
color: secondaryColor,
borderRadius: BorderRadius.all(Radius.circular(30))),
padding: const EdgeInsets.all(defaultPadding),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.project.title!,
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 20, color: primaryColor),
),
Spacer(),
Text(
widget.project.description!,
maxLines: Responsive.isMobileLarge(context) ? 3 : 4,
overflow: TextOverflow.ellipsis,
style: TextStyle(height: 1.5),
),
Spacer(),
],
)),
);
}
}
import 'package:flutter/material.dart';
class ProjectsGridView extends StatelessWidget {
const ProjectsGridView({
Key? key,
this.crossAxisCount = 3,
this.childAspectRatio = 1.5,
}) : super(key: key);
final int crossAxisCount;
final double childAspectRatio;
@override
Widget build(BuildContext context) {
return GridView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: demo_projects.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: crossAxisCount,
childAspectRatio: childAspectRatio,
crossAxisSpacing: defaultPadding,
mainAxisSpacing: defaultPadding,
),
itemBuilder: (context, index) => ProjectCard(
project: demo_projects[index],
),
);
}
}
class Project {
final String? title, description;
void Function () onTap;
Project({this.title, this.description, required this.onTap});
}
// ignore: non_constant_identifier_names
List<Project> demo_projects = [
Project(
title: "Test",
description:
"Test",
onTap: (){},
)
];
3 ответа
Сделайте свой класс с отслеживанием состояния и попробуйте с помощью initstate
import 'package:flutter/material.dart';
class ProjectCard extends StatefulWidget {
const ProjectCard({
Key? key,
required this.project,
}) : super(key: key);
final Project project;
@override
_ProjectCardState createState() => _ProjectCardState();
}
class _ProjectCardState extends State<ProjectCard> {
List<Project> demo_projects= [];
@override
void initState() {
// TODO: implement initState
super.initState();
demo_projects.add(Project(
title: "Test",
description:
"Test",
onTap: (){Navigator.pushNamed(context, '/second');},
),);
}
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {},
child: Container(
decoration: BoxDecoration(
color: secondaryColor,
borderRadius: BorderRadius.all(Radius.circular(30))),
padding: const EdgeInsets.all(defaultPadding),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.project.title!,
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 20, color: primaryColor),
),
Spacer(),
Text(
widget.project.description!,
maxLines: Responsive.isMobileLarge(context) ? 3 : 4,
overflow: TextOverflow.ellipsis,
style: TextStyle(height: 1.5),
),
Spacer(),
],
)),
);
}
}
Вы получаете эту ошибку, потому что вы нигде не определили контекст переменной и пытаетесь передать ее.
List<Project> demo_projects = [
Project(
title: "Test",
description:
"Test",
onTap: (){Navigator.pushNamed(**context**, '/second');},
),
Обычно у вас есть контекст внутри метода сборки ваших виджетов.
@override
Widget build(BuildContext context) {
}
Вы не предоставили полный фрагмент кода, поэтому я не знаю полной реализации.
Попробуйте объявить переменную контекста, надеюсь, это вам поможет.
class Project {
final BuildContext context;
final String title, description;
void Function() onTap;
Project({
this.title,
this.context,
this.description,
@required this.onTap,
});
}
BuildContext context;
List<Project> demo_projects = [
Project(
context: context,
title: "Test",
description: "Test",
onTap: () {
Navigator.pushNamed(context, '/second');
},
),
];