Перейти к содержимому

Filter provider что это

  • автор:

Расширение фильтра Обозреватель решений

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

Вы можете расширить функциональные возможности фильтра Обозреватель решений для отображения или скрытия разных файлов. Например, можно создать фильтр, отображающий только файлы фабрики классов C# в Обозреватель решений, как показано в этом пошаговом руководстве.

Создание проекта пакета Visual Studio

  1. Создайте проект VSIX с именем FileFilter . Добавьте пользовательский шаблон элемента командной строки с именем FileFilter. Дополнительные сведения см. в разделе «Создание расширения» с помощью команды меню.
  2. Добавьте ссылку на System.ComponentModel.Composition и Microsoft.VisualStudio.Utilities .
  3. Выберите команду меню на панели инструментов Обозреватель решений. Откройте файл FileFilterPackage.vsct.
  4. Измените блок следующим образом:
  

Обновление файла манифеста

  1. В файле source.extension.vsixmanifest добавьте ресурс, который является компонентом MEF.
  2. На вкладке «Активы» нажмите кнопку «Создать «.
  3. В поле «Тип« выберите Microsoft.VisualStudio.MefComponent.
  4. В поле «Источник« выберите проект в текущем решении.
  5. В поле «Проект» выберите FileFilter и нажмите кнопку «ОК«.

Добавление кода фильтра

  1. Добавьте некоторые идентификаторы GUID в файл FileFilterPackageGuids.cs :
public const string guidFileFilterPackageCmdSetString = "00000000-0000-0000-0000-00000000"; // get your GUID from the .vsct file public const int FileFilterId = 0x100; 
using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.Internal.VisualStudio.PlatformUI; using Microsoft.VisualStudio.Shell; namespace FileFilter < // Implements ISolutionTreeFilterProvider. The SolutionTreeFilterProvider attribute declares it as a MEF component [SolutionTreeFilterProvider(FileFilterPackageGuids.guidFileFilterPackageCmdSetString, (uint)(FileFilterPackageGuids.FileFilterId))] public sealed class FileNameFilterProvider : HierarchyTreeFilterProvider < SVsServiceProvider svcProvider; IVsHierarchyItemCollectionProvider hierarchyCollectionProvider; // Constructor required for MEF composition [ImportingConstructor] public FileNameFilterProvider(SVsServiceProvider serviceProvider, IVsHierarchyItemCollectionProvider hierarchyCollectionProvider) < this.svcProvider = serviceProvider; this.hierarchyCollectionProvider = hierarchyCollectionProvider; >// Returns an instance of Create filter class. protected override HierarchyTreeFilter CreateFilter() < return new FileNameFilter(this.svcProvider, this.hierarchyCollectionProvider, FileNamePattern); >// Regex pattern for CSharp factory classes private const string FileNamePattern = @"\w*factory\w*(.cs$)"; // Implementation of file filtering private sealed class FileNameFilter : HierarchyTreeFilter < private readonly Regex regexp; private readonly IServiceProvider svcProvider; private readonly IVsHierarchyItemCollectionProvider hierarchyCollectionProvider; public FileNameFilter( IServiceProvider serviceProvider, IVsHierarchyItemCollectionProvider hierarchyCollectionProvider, string fileNamePattern) < this.svcProvider = serviceProvider; this.hierarchyCollectionProvider = hierarchyCollectionProvider; this.regexp = new Regex(fileNamePattern, RegexOptions.IgnoreCase); >// Gets the items to be included from this filter provider. // rootItems is a collection that contains the root of your solution // Returns a collection of items to be included as part of the filter protected override async Task GetIncludedItemsAsync(IEnumerable rootItems) < IVsHierarchyItem root = HierarchyUtilities.FindCommonAncestor(rootItems); IReadOnlyObservableSetsourceItems; sourceItems = await hierarchyCollectionProvider.GetDescendantsAsync( root.HierarchyIdentity.NestedHierarchy, CancellationToken); IFilteredHierarchyItemSet includedItems = await hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync( sourceItems, ShouldIncludeInFilter, CancellationToken); return includedItems; > // Returns true if filters hierarchy item name for given filter; otherwise, false private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem) < if (hierarchyItem == null) < return false; >return this.regexp.IsMatch(hierarchyItem.Text); > > > > 
private FileFilter(Package package) < if (package == null) < throw new ArgumentNullException("package"); >this.package = package; > 
protected override void Initialize() < Debug.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: ", this.ToString())); base.Initialize(); > 

Тестирование кода

  1. Постройте и запустите проект. Откроется второй экземпляр Visual Studio. Это называется экспериментальным экземпляром.
  2. В экспериментальном экземпляре Visual Studio откройте проект C#.
  3. Найдите кнопку, добавленную на панели инструментов Обозреватель решений. Она должна быть четвертой кнопкой слева.
  4. При нажатии кнопки все файлы должны быть отфильтрованы, и вы увидите, что все элементы отфильтрованы из представления. В Обозреватель решений.

Filter provider что это

Oops! An error has occurred

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

ПРОДУКТЫ И УСЛУГИ

  • О нас
  • Опубликуйте приложение
  • Реклама
  • Часто задаваемые вопросы и поддержка
  • Работа у нас
  • Корпоративный блог
  • Условия предоставления услуг для пользователей
  • Политика конфиденциальности
  • Параметры Cookie
  • Условия предоставления услуг для разработчиков
  • DMCA

Filter provider что это

Oops! An error has occurred

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

ПРОДУКТЫ И УСЛУГИ

  • О нас
  • Опубликуйте приложение
  • Реклама
  • Часто задаваемые вопросы и поддержка
  • Работа у нас
  • Корпоративный блог
  • Условия предоставления услуг для пользователей
  • Политика конфиденциальности
  • Параметры Cookie
  • Условия предоставления услуг для разработчиков
  • DMCA

Фреймворк реактивного State-Management и Dependency Injection

Write business logic in a manner similar to Stateless widgets.
Have your network requests to automatically recompute when necessary and make your logic easily reusable/composable/maintainable.

Easily implement common UI patterns

Using Riverpod, common yet complex UI patterns such as «pull to refresh»/ «search as we type»/etc. are only a few lines of code away.

Tooling ready

Riverpod enhances the compiler by having common mistakes be a compilation-error. It also provides custom lint rules and refactoring options. It even has a command line for generating docs.

Features

  • ✅ Declarative programming
  • ✅ Native network requests support
  • ✅ Automatic loading/error handling
  • ✅ Compile safety
  • ✅ Type-safe query parameters
  • ✅ Test ready
  • ✅ Work in plain Dart (servers/CLI/. )
  • ✅ Easily combinable states
  • ✅ Built-in support for pull-to-refresh
  • ✅ Custom lint rules
  • ✅ Built-in refactorings
  • ✅ Hot-reload support
  • ✅ Logging
  • ✅ Websocket support
  • ✅ Documentation generator

Объявление общего состояния где-угодно

Больше не нужно переключаться между main.dart и UI файлами.
Пишите код состояния там, где он нужен — будь то отдельный пакет или виджет — без уменьшения тестируемости.

  // A shared state that can be accessed by multiple widgets at the same time. @riverpod class Count extends _$Count   @override  int build() => 0;  void increment() => state++; >  // Consumes the shared state and rebuild when it changes class Title extends ConsumerWidget   @override Widget build(BuildContext context, WidgetRef ref)   final count = ref.watch(countProvider); return Text('$count'); > > 

Перевычисление значений / перестройка UI, только когда это необходимо

Больше не нужно осуществлять сортировку / фильтрацию внутри метода build и использовать сложные механизмы кэширования.

С Provider и вы можете сортировать списки или выполнять HTTP запросы, только когда это действительно вам нужно.

  @riverpod ListTodo> filteredTodos(FilteredTodosRef ref)   // Providers can consumer other providers using the "ref" object. // With ref.watch, providers will automatically update if the watched values changes. final ListTodo> todos = ref.watch(todosProvider); final Filter filter = ref.watch(filterProvider);  switch (filter)   case Filter.all: return todos; case Filter.completed: return todos.where((todo) => todo.completed).toList(); case Filter.uncompleted: return todos.where((todo) => !todo.completed).toList(); > > 

Simplify day-to-day work with refactors

Riverpod offers various refactors, such as «Wrap widget in a Consumer» and many more. See the list of refactorings.

Keep your code maintainable with lint rules

New lint-rules specific to Riverpod are implemented and more are continuously added. This ensures your code stays in the best conditions. See the list of lint rules.

Безопасное чтение провайдеров

Чтение провайдера никогда не приведет к bad state. При правильном использовании провайдера вы всегда сможете получить допустимое значение.

Это также относится к асинхронно полученным значениям. Riverpod в отличие от provider позволяет элегантно обрабатывать загрузку/ошибки.

  @riverpod FutureConfiguration> configurations(ConfigurationsRef ref) async   final uri = Uri.parse('configs.json'); final rawJson = await File.fromUri(uri).readAsString();  return Configuration.fromJson(json.decode(rawJson)); >  class Example extends ConsumerWidget   @override Widget build(BuildContext context, WidgetRef ref)   final configs = ref.watch(configurationsProvider);  // Use pattern matching to safely handle loading/error states return switch (configs)   AsyncData(:final value) => Text('data: $value.host>'), AsyncError(:final error) => Text('error: $error'),  _ => const CircularProgressIndicator(), >; > > 

Проверка вашего состояния в devtool

Riverpod делает видимым ваше состояние в Flutter devtool.
Более того, уже разрабатывается полномасштабный инспектор состояния.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *