Файл констант флаттера с пакетом провайдера - PullRequest
1 голос
/ 03 мая 2020

У меня проблемы с поиском лучшего способа установки некоторых констант (в основном, строк). В настоящее время я использую файл constants.dart, в котором определены переменные const, и импортирую его всякий раз, когда это необходимо. Нет класса или что-нибудь, просто пустой файл дротика. Это работает, однако я недавно реализовал локализацию с помощью плагина Flutter Intl в Android Studio. Я получил все для работы и могу сделать что-то вроде этого S.of(context).settings, и он получает перевод из правильного файла. Моя проблема связана с постоянным списком строк, которые есть в моем файле constants.dart. Я использую их во многих местах для выбора вариантов. Они выглядят так:

const playType = [
  'RP/Story Focused',
  'Battle/Combat Focused',
  'Puzzles and Challenges',
  'Exploration/Travel',
];
const length = [
  'One Shot',
  '2-5 Sessions',
  '5-10 Sessions',
  'On-going Campaign',
];

Я не могу изменить строки на ссылку Intl, потому что нет контекста для передачи. Не уверен, как настроить загруженный класс, но не уверен, как настроить его и использовать пакет Provider для его обслуживания.

РЕДАКТИРОВАТЬ: вот файл констант. Звонить с провайдером это нормально. Проблема возникает, когда мне нужно использовать локализацию для строк в списках

import 'package:scryer/generated/l10n.dart';

class Constants {
  Constants._();
  static final instance = Constants._();

  static List<String> playType = [
    S.of(context).rpstoryFocused,//need a reference to a context
    'Battle/Combat Focused',
    'Puzzles and Challenges',
    'Exploration/Travel',
  ];
  static const length = [
    'One Shot',
    '2-5 Sessions',
    '5-10 Sessions',
    'On-going Campaign',
  ];
}

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

MaterialPageRoute(builder: (context) {
  return MultiSelectScreen(
    args: MultiSelectArguments(
      label: S.of(context).selectPreferredPlayStyle,
      options: playType, //this is the constants list reference
      selections:
        profile.playType,
    ),
  );
})

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

1 Ответ

0 голосов
/ 04 мая 2020

вы можете попробовать.

class Constants {
   final BuildContext context;
   Constants(@required this.context);
 //  static final instance = Constants._();     // to make class a singleton

static  const playType = [
    'RP/Story Focused',
    'Battle/Combat Focused',
    'Puzzles and Challenges',
    'Exploration/Travel',
  ];
static const length = [
    'One Shot',
    '2-5 Sessions',
    '5-10 Sessions',
    'On-going Campaign',
 ];

}

Затем, на root вашего проекта вы должны предоставить этот класс, как;

void main() {

/** WidgetsFlutterBinding.ensureInitialized() is required in Flutter v1.9.4+ before using any plugins if the code is executed before runApp. */
  WidgetsFlutterBinding.ensureInitialized();

     runApp( Provider( 
       create: (context) => Constants(context),
       child: MyApp(),
       ),
   );

}

Вы сможете получить доступ к этим константам в любом BuildContext в любом месте виджета. дерево следующим образом;

final Contants constants = Provider<Constants>.of(context);

вы получите постоянную длины, как; constants.length

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...