Как мне обернуть CupertinoApp в виджет локализаций, чтобы я мог использовать в нем виджеты материалов? - PullRequest
0 голосов
/ 30 апреля 2019

Я использую виджет CupertinoApp, чтобы обернуть свое приложение, пытаясь использовать внутри него виджет Material TextFormField.

Когда я, например, запускаю режим выделения текста (дважды нажмите на текстовое поле), яполучая следующую ошибку (потому что он пытается открыть наложенный виджет, который требует локализацию материала):

Сообщение об ошибке

Не найдено локализаций материала.Виджеты OverlayEntry требуют предоставления MaterialLocalizations предком виджета Localizations.

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

Чтобы ввести MaterialLocalizations, либо используйте MaterialApp в корне вашего приложения, чтобы: включить их автоматически, либо добавить виджет Локализация с делегатом MaterialLocalizations.


Проблема в том, чтоЯ не могу использовать MaterialApp, так как мне нужно использовать навигацию в стиле Купертино (вложенные навигаторы внутри CupertinoTabBar / CupertinoTabView), поэтому мне нужно использовать подход виджета Локализация.

Однако следующий код не решает проблему:

void main() {
  runApp(
    Localizations(
      child: CupertinoApp(
        debugShowCheckedModeBanner: false,
        home: App(), // <-- Main Screen, a Cupertino Tab Scaffold with 3 CupertinoTabViews
      ),
      locale: Locale('en', 'US'),
      delegates: <LocalizationsDelegate>[

        // I assumed these were sufficient, but the runtime exception still persist.
        DefaultMaterialLocalizations.delegate,
        DefaultCupertinoLocalizations.delegate,
        DefaultWidgetsLocalizations.delegate,
      ],
    ),
  );
}

Тогда у меня вопрос: как правильно это сделать, нельзя ли использовать виджет Материал в CupertinoApp?

I/flutter ( 7631): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 7631): The following assertion was thrown building
I/flutter ( 7631): _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#1e5c6](dirty, dependencies:
I/flutter ( 7631): [_LocalizationsScope-[GlobalKey#d1cfa]], state: _OverlayEntryState#ba2a3):
I/flutter ( 7631): No MaterialLocalizations found.
I/flutter ( 7631): _OverlayEntry widgets require MaterialLocalizations to be provided by a Localizations widget
I/flutter ( 7631): ancestor.
I/flutter ( 7631): Localizations are used to generate many different messages, labels,and abbreviations which are used
I/flutter ( 7631): by the material library. 
I/flutter ( 7631): To introduce a MaterialLocalizations, either use a  MaterialApp at the root of your application to
I/flutter ( 7631): include them automatically, or add a Localization widget with a MaterialLocalizations delegate.
I/flutter ( 7631): The specific widget that could not find a MaterialLocalizations ancestor was:
I/flutter ( 7631):   _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#1e5c6]
I/flutter ( 7631): The ancestors of this widget were:
I/flutter ( 7631):   Stack(alignment: AlignmentDirectional.topStart, fit: expand, overflow: clip)
I/flutter ( 7631):   _Theatre
I/flutter ( 7631):   Overlay-[LabeledGlobalKey<OverlayState>#362c7]
I/flutter ( 7631):   _FocusScopeMarker
I/flutter ( 7631):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
I/flutter ( 7631):   hintOverrides: null)
I/flutter ( 7631):   FocusScope
I/flutter ( 7631):   AbsorbPointer(absorbing: false)
I/flutter ( 7631):   Listener(listeners: [down, up, cancel], behavior: deferToChild)
I/flutter ( 7631):   Navigator-[GlobalObjectKey<NavigatorState> _WidgetsAppState#2397a]
I/flutter ( 7631):   DefaultTextStyle(inherit: false, color: Color(0xff000000), family: .SF Pro Text, size: 17.0,
I/flutter ( 7631):   letterSpacing: -0.4, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow:
I/flutter ( 7631):   clip)
I/flutter ( 7631):   Title(color: Color(0xff007aff))
I/flutter ( 7631):   Directionality(textDirection: ltr)
I/flutter ( 7631):   _LocalizationsScope-[GlobalKey#d1cfa]
I/flutter ( 7631):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
I/flutter ( 7631):   textDirection: ltr, hintOverrides: null)
I/flutter ( 7631):   Localizations(locale: en_US, delegates: [DefaultCupertinoLocalizations.delegate(en_US),
I/flutter ( 7631):   DefaultWidgetsLocalizations.delegate(en_US)])
I/flutter ( 7631):   MediaQuery(MediaQueryData(size: Size(411.4, 683.4), devicePixelRatio: 2.6, textScaleFactor: 1.0,
I/flutter ( 7631):   platformBrightness: Brightness.light, padding: EdgeInsets(0.0, 24.0, 0.0, 0.0), viewInsets:
I/flutter ( 7631):   EdgeInsets.zero, alwaysUse24HourFormat: false, accessibleNavigation: falsedisableAnimations:
I/flutter ( 7631):   falseinvertColors: falseboldText: false))
I/flutter ( 7631):   WidgetsApp-[GlobalObjectKey _CupertinoAppState#5df27]
I/flutter ( 7631):   IconTheme(IconThemeData#33904(color: Color(0xff007aff)))
I/flutter ( 7631):   _InheritedCupertinoTheme
I/flutter ( 7631):   CupertinoTheme
I/flutter ( 7631):   ScrollConfiguration(behavior: _AlwaysCupertinoScrollBehavior)
I/flutter ( 7631):   CupertinoApp
I/flutter ( 7631):   Directionality(textDirection: ltr)
I/flutter ( 7631):   _LocalizationsScope-[GlobalKey#dfb7d]
I/flutter ( 7631):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
I/flutter ( 7631):   textDirection: ltr, hintOverrides: null)
I/flutter ( 7631):   Localizations(locale: en_US, delegates: [DefaultMaterialLocalizations.delegate(en_US),
I/flutter ( 7631):   DefaultCupertinoLocalizations.delegate(en_US), DefaultWidgetsLocalizations.delegate(en_US)])
I/flutter ( 7631):   _InheritedModel<AppModel>
I/flutter ( 7631):   AnimatedBuilder(animation: Instance of 'AppModel')
I/flutter ( 7631):   ScopedModel<AppModel>
I/flutter ( 7631):   [root]
I/flutter ( 7631): 
I/flutter ( 7631): When the exception was thrown, this was the stack:
I/flutter ( 7631): #0      debugCheckHasMaterialLocalizations.<anonymous closure> (package:flutter/src/material/debug.dart:124:7)
I/flutter ( 7631): #1      debugCheckHasMaterialLocalizations (package:flutter/src/material/debug.dart:127:4)
I/flutter ( 7631): #2      _MaterialTextSelectionControls.buildToolbar (package:flutter/src/material/text_selection.dart:135:12)
// ....

1 Ответ

1 голос
/ 30 апреля 2019

Вы не должны заключать CupertinoApp в Localization.

CupertinoApp включает вставку собственного виджета Localization, поэтому все, что вы добавили выше CupertinoApp, просто переопределяется.

Вместо этого передайте своих делегатов непосредственно localizationsDelegates из CupertinoApp:

CupertinoApp(
  localizationsDelegates: [
    DefaultMaterialLocalizations.delegate,
    DefaultCupertinoLocalizations.delegate,
    DefaultWidgetsLocalizations.delegate,
  ],
),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...