Skip to content

Incorrect handling of prefix imports #4372

@FaFre

Description

@FaFre

The riverpod generator can not distinct multiple prefix imports of the same class name. In this example there is ui.Locale and intl.Locale. However the generator falsely always uses ui.Locale.

The following code:

import 'dart:ui' as ui;

import 'package:flutter/widgets.dart';
import 'package:intl/locale.dart' as intl;
import 'package:locale_resolver/locale_resolver.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'locale_resolver.g.dart';

@Riverpod(keepAlive: true)
class LocaleResolverRepository extends _$LocaleResolverRepository {
  final _service = LocaleResolver();
  final _cache = <intl.Locale, LocalizedResult>{};

  Future<LocalizedResult> resolve(intl.Locale locale) async {
    final cached = _cache[locale];
    if (cached != null) {
      return cached;
    }

    return _cache[locale] = await _service.resolve(
      locale.toLanguageTag(),
      targetLocale.toLanguageTag(),
    );
  }

  @override
  void build(ui.Locale targetLocale) {}
}

@Riverpod()
Future<LocalizedResult> resolveLocale(Ref ref, intl.Locale locale) {
  return ref
      .read(
        localeResolverRepositoryProvider(
          WidgetsBinding.instance.platformDispatcher.locale,
        ).notifier,
      )
      .resolve(locale);
}

Will produce following output:

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'locale_resolver.dart';

// **************************************************************************
// RiverpodGenerator
// **************************************************************************

// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning

@ProviderFor(LocaleResolverRepository)
const localeResolverRepositoryProvider = LocaleResolverRepositoryFamily._();

final class LocaleResolverRepositoryProvider
    extends $NotifierProvider<LocaleResolverRepository, void> {
  const LocaleResolverRepositoryProvider._({
    required LocaleResolverRepositoryFamily super.from,
    required ui.Locale super.argument,
  }) : super(
         retry: null,
         name: r'localeResolverRepositoryProvider',
         isAutoDispose: false,
         dependencies: null,
         $allTransitiveDependencies: null,
       );

  @override
  String debugGetCreateSourceHash() => _$localeResolverRepositoryHash();

  @override
  String toString() {
    return r'localeResolverRepositoryProvider'
        ''
        '($argument)';
  }

  @$internal
  @override
  LocaleResolverRepository create() => LocaleResolverRepository();

  /// {@macro riverpod.override_with_value}
  Override overrideWithValue(void value) {
    return $ProviderOverride(
      origin: this,
      providerOverride: $SyncValueProvider<void>(value),
    );
  }

  @override
  bool operator ==(Object other) {
    return other is LocaleResolverRepositoryProvider &&
        other.argument == argument;
  }

  @override
  int get hashCode {
    return argument.hashCode;
  }
}

String _$localeResolverRepositoryHash() =>
    r'291f78395819e44be04c29c1af80fe0a2a078690';

final class LocaleResolverRepositoryFamily extends $Family
    with
        $ClassFamilyOverride<
          LocaleResolverRepository,
          void,
          void,
          void,
          ui.Locale
        > {
  const LocaleResolverRepositoryFamily._()
    : super(
        retry: null,
        name: r'localeResolverRepositoryProvider',
        dependencies: null,
        $allTransitiveDependencies: null,
        isAutoDispose: false,
      );

  LocaleResolverRepositoryProvider call(ui.Locale targetLocale) =>
      LocaleResolverRepositoryProvider._(argument: targetLocale, from: this);

  @override
  String toString() => r'localeResolverRepositoryProvider';
}

abstract class _$LocaleResolverRepository extends $Notifier<void> {
  late final _$args = ref.$arg as ui.Locale;
  ui.Locale get targetLocale => _$args;

  void build(ui.Locale targetLocale);
  @$mustCallSuper
  @override
  void runBuild() {
    build(_$args);
    final ref = this.ref as $Ref<void, void>;
    final element =
        ref.element
            as $ClassProviderElement<
              AnyNotifier<void, void>,
              void,
              Object?,
              Object?
            >;
    element.handleValue(ref, null);
  }
}

@ProviderFor(resolveLocale)
const resolveLocaleProvider = ResolveLocaleFamily._();

final class ResolveLocaleProvider
    extends
        $FunctionalProvider<
          AsyncValue<LocalizedResult>,
          LocalizedResult,
          FutureOr<LocalizedResult>
        >
    with $FutureModifier<LocalizedResult>, $FutureProvider<LocalizedResult> {
  const ResolveLocaleProvider._({
    required ResolveLocaleFamily super.from,
    required ui.Locale super.argument,
  }) : super(
         retry: null,
         name: r'resolveLocaleProvider',
         isAutoDispose: true,
         dependencies: null,
         $allTransitiveDependencies: null,
       );

  @override
  String debugGetCreateSourceHash() => _$resolveLocaleHash();

  @override
  String toString() {
    return r'resolveLocaleProvider'
        ''
        '($argument)';
  }

  @$internal
  @override
  $FutureProviderElement<LocalizedResult> $createElement(
    $ProviderPointer pointer,
  ) => $FutureProviderElement(pointer);

  @override
  FutureOr<LocalizedResult> create(Ref ref) {
    final argument = this.argument as ui.Locale;
    return resolveLocale(ref, argument);
  }

  @override
  bool operator ==(Object other) {
    return other is ResolveLocaleProvider && other.argument == argument;
  }

  @override
  int get hashCode {
    return argument.hashCode;
  }
}

String _$resolveLocaleHash() => r'2f9c0cb9bf64e0887eda3e7574e1bfee3b9cc74d';

final class ResolveLocaleFamily extends $Family
    with $FunctionalFamilyOverride<FutureOr<LocalizedResult>, ui.Locale> {
  const ResolveLocaleFamily._()
    : super(
        retry: null,
        name: r'resolveLocaleProvider',
        dependencies: null,
        $allTransitiveDependencies: null,
        isAutoDispose: true,
      );

  ResolveLocaleProvider call(ui.Locale locale) =>
      ResolveLocaleProvider._(argument: locale, from: this);

  @override
  String toString() => r'resolveLocaleProvider';
}

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions