// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('Nested Localizations', (WidgetTester tester) async { await tester.pumpWidget(new MaterialApp( // Creates the outer Localizations widget. home: new ListView( children: <Widget>[ const LocalizationTracker(key: const ValueKey<String>('outer')), new Localizations( locale: const Locale('zh', 'CN'), delegates: GlobalMaterialLocalizations.delegates, child: const LocalizationTracker(key: const ValueKey<String>('inner')), ), ], ), )); final LocalizationTrackerState outerTracker = tester.state(find.byKey(const ValueKey<String>('outer'))); expect(outerTracker.captionFontSize, 12.0); final LocalizationTrackerState innerTracker = tester.state(find.byKey(const ValueKey<String>('inner'))); expect(innerTracker.captionFontSize, 13.0); }); testWidgets('Localizations is compatible with ChangeNotifier.dispose() called during didChangeDependencies', (WidgetTester tester) async { // PageView calls ScrollPosition.dispose() during didChangeDependencies. await tester.pumpWidget( new MaterialApp( supportedLocales: const <Locale>[ const Locale('en', 'US'), const Locale('es', 'ES'), ], localizationsDelegates: <LocalizationsDelegate<dynamic>>[ new _DummyLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, ], home: new PageView(), ) ); await tester.binding.setLocale('es', 'US'); await tester.pump(); await tester.pumpWidget(new Container()); }); } /// A localizations delegate that does not contain any useful data, and is only /// used to trigger didChangeDependencies upon locale change. class _DummyLocalizationsDelegate extends LocalizationsDelegate<DummyLocalizations> { @override Future<DummyLocalizations> load(Locale locale) async => new DummyLocalizations(); @override bool isSupported(Locale locale) => true; @override bool shouldReload(_DummyLocalizationsDelegate old) => true; } class DummyLocalizations {} class LocalizationTracker extends StatefulWidget { const LocalizationTracker({Key key}) : super(key: key); @override State<StatefulWidget> createState() => new LocalizationTrackerState(); } class LocalizationTrackerState extends State<LocalizationTracker> { double captionFontSize; @override Widget build(BuildContext context) { captionFontSize = Theme.of(context).textTheme.caption.fontSize; return new Container(); } }