Flutter Неопределенное имя «контекст». Попробуйте исправить имя на то, которое определено, или определить имя - PullRequest
2 голосов
/ 12 июля 2020

Любая помощь, пожалуйста, как передать контекст в этой ошибке класса: Undefined name 'context'. Попробуйте исправить имя на то, которое определено, или определить имя.

, когда я передаю имя категории в виде строки, оно работает нормально, как класс ниже отлично работает

import 'package:flutter/material.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:domain/classes/localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';



// products categories
class Category  {
  int id;
  String name;
  Icon icon;
  Color color;

  Category(this.id, this.name, this.icon, this.color);
  static List<Category> getCategories() {

    return <Category>[
      Category(0, 'All' ,Icon(Icons.border_all, size: 30.0,), Colors.red),
      Category(1, 'Phones' ,Icon(Icons.phone_android, size: 30.0,), Colors.blue),
      Category(2, 'Electronics', Icon(Icons.devices_other, size: 30.0,), Colors.lightBlue),
      Category(3, 'Woman Fashions',Icon(MdiIcons.humanFemale, size: 30.0,), Colors.pink),
      Category(4, 'Woman Accessories',Icon(MdiIcons.shoeHeel, size: 30.0,), Colors.pink),
      Category(5, 'Man Fashions',Icon(MdiIcons.humanMale, size: 30.0,), Colors.brown),
      Category(6, 'Man Accessories',Icon(MdiIcons.shoeFormal, size: 30.0,), Colors.brown),
      Category(7, 'Baby Child', Icon(Icons.child_care, size: 30.0,), Colors.lightBlueAccent),
      Category(8, 'Sports Outdoors', Icon(Icons.fitness_center, size: 30.0,), Colors.blueAccent),
      Category(9, 'Gaming',Icon(Icons.videogame_asset, size: 30.0,), Colors.deepPurple),
      Category(10, 'Home Appliances', Icon(Icons.home, size: 30.0,), Colors.green),
      Category(11, 'Cars',Icon(Icons.directions_car, size: 30.0,), Colors.blueGrey),
      Category(12, 'Auto Parts', Icon(MdiIcons.carBattery, size: 30.0,), Colors.blueGrey),
      Category(13, 'Trucks Bus', Icon(Icons.local_shipping, size: 30.0,), Colors.blueGrey),
      Category(14, 'Other Vehicles', Icon(Icons.directions_boat, size: 30.0,), Colors.blueGrey),
      Category(15, 'Housing Sale', Icon(MdiIcons.homeGroup, size: 30.0,), Colors.black),
    ];
  }

Но я хотите, чтобы имена категорий автоматически переводились и загружались в зависимости от языка пользовательского устройства, поэтому, когда я вызываю переведенное имя из класса локализации, это дает мне ошибку

Undefined name 'context'.  Try correcting the name to one that is defined, or defining the name.

Я не знаю, как передайте контекст любую помощь, пожалуйста

import 'package:flutter/material.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:domain/classes/localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';



// products categories
class Category  {
  int id;
  String name;
  Icon icon;
  Color color;

  Category(this.id, this.name, this.icon, this.color);
  static List<Category> getCategories() {

    return <Category>[
      Category(0, DemoLocalizations.of(context).allCategories ,Icon(Icons.border_all, size: 30.0,), Colors.red),
      Category(1, DemoLocalizations.of(context).phones ,Icon(Icons.phone_android, size: 30.0,), Colors.blue),
      Category(2, DemoLocalizations.of(context).electronics, Icon(Icons.devices_other, size: 30.0,), Colors.lightBlue),
    ];
  }


}
    

1 Ответ

1 голос
/ 12 июля 2020

Контекст не является глобальной переменной.

Доступ к контексту можно получить только с помощью метода build, initState et c. внутри виджета. Итак, вам нужно взять context в качестве аргумента при создании вашего класса и назначить его this.context.

class Category  {
  int id;
  String name;
  Icon icon;
  Color color;
  BuildContext context;

  Category(this.id, this.name, this.icon, this.color, this.context);
  static List<Category> getCategories() {

    return <Category>[
      Category(0, DemoLocalizations.of(context).allCategories ,Icon(Icons.border_all, size: 30.0,), Colors.red),
      Category(1, DemoLocalizations.of(context).phones ,Icon(Icons.phone_android, size: 30.0,), Colors.blue),
      Category(2, DemoLocalizations.of(context).electronics, Icon(Icons.devices_other, size: 30.0,), Colors.lightBlue),
    ];
  }

}

И при вызове передать контекст сборки текущего виджета Category(..., context);

А когда есть несколько свойств, более элегантно иметь их все как Category({@required this.id, @required this.name, ...}, чтобы вы знали, что вы передаете при вызове конструктора.

...