Skip to content

Commit

Permalink
Merge pull request #49 from sujrd/47-widgets-are-not-properly-updated…
Browse files Browse the repository at this point in the history
…-when-changing-locale

Refactor Localization
  • Loading branch information
hanny-ph authored Oct 12, 2023
2 parents 5c710a5 + e4c6b15 commit f0680bc
Show file tree
Hide file tree
Showing 66 changed files with 866 additions and 476 deletions.
41 changes: 36 additions & 5 deletions example/lib/custom_questionnaire_stepper_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:faiadashu/faiadashu.dart';
import 'package:faiadashu_example/main.dart';
import 'package:flutter/material.dart';

class CustomQuestionnaireStepperPage extends StatefulWidget {
Expand Down Expand Up @@ -41,7 +42,8 @@ class _CustomQuestionnaireStepperPageState
}

// Validate the first matching item, and if it's valid, navigate to the next page
if (matchingItems.first.validate(notifyListeners: true) == null) {
final errors = matchingItems.first.validate(notifyListeners: true);
if (errors.isEmpty) {
_navigateToNextPage();
}
}
Expand All @@ -67,8 +69,39 @@ class _CustomQuestionnaireStepperPageState
children: [
Expanded(
child: QuestionnaireStepper(
scaffoldBuilder:
const DefaultQuestionnairePageScaffoldBuilder(),
scaffoldBuilder: DefaultQuestionnairePageScaffoldBuilder(
persistentFooterButtons: [
PopupMenuButton<Locale>(
icon: const Icon(Icons.language),
onSelected: (Locale locale) {
LocaleInheritedWidget.of(context)
.updateLocale(locale);
},
itemBuilder: (BuildContext context) =>
<PopupMenuEntry<Locale>>[
const PopupMenuItem<Locale>(
value: Locale('en'),
child: Text('English'),
),
const PopupMenuItem<Locale>(
value: Locale('ar'),
child: Text('عَرَبِيّ'),
),
const PopupMenuItem<Locale>(
value: Locale('de'),
child: Text('Deutsch'),
),
const PopupMenuItem<Locale>(
value: Locale('es'),
child: Text('Español'),
),
const PopupMenuItem<Locale>(
value: Locale('ja'),
child: Text('日本語'),
),
],
),
]),
fhirResourceProvider: widget.fhirResourceProvider,
launchContext: widget.launchContext,
controller: _controller,
Expand All @@ -77,8 +110,6 @@ class _CustomQuestionnaireStepperPageState
},
onPageChanged: _onPageChanged,
onBeforePageChanged: (currentItemModel, nextItemModel) async {
/// Adding delay
await Future.delayed(Duration(seconds: 1));
return BeforePageChangedData(canProceed: true);
},
onVisibleItemUpdated: (item) {
Expand Down
97 changes: 72 additions & 25 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,32 +44,73 @@ void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);

@override
MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
Locale _currentLocale = const Locale('en', 'US');

void _updateLocale(Locale newLocale) {
setState(() {
_currentLocale = newLocale;
});
}

@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData.light(useMaterial3: true).copyWith(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.pink),
inputDecorationTheme: ThemeData.light(useMaterial3: true).inputDecorationTheme.copyWith(
filled: true,
),
return LocaleInheritedWidget(
updateLocale: _updateLocale,
currentLocale: _currentLocale,
child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData.light(useMaterial3: true).copyWith(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.pink),
inputDecorationTheme:
ThemeData.light(useMaterial3: true).inputDecorationTheme.copyWith(
filled: true,
),
),
darkTheme: ThemeData.dark(useMaterial3: true),
title: 'Faiadashu™ FHIRDash Gallery',
localizationsDelegates: const [
FDashLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: FDashLocalizations.supportedLocales,
locale: _currentLocale,
home: const HomePage(),
),
darkTheme: ThemeData.dark(useMaterial3: true),
title: 'Faiadashu™ FHIRDash Gallery',
localizationsDelegates: const [
FDashLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: FDashLocalizations.supportedLocales,
home: const HomePage(),
);
}
}

class LocaleInheritedWidget extends InheritedWidget {
final Function(Locale) updateLocale;
final Locale currentLocale;

const LocaleInheritedWidget({
Key? key,
required this.updateLocale,
required this.currentLocale,
required Widget child,
}) : super(key: key, child: child);

@override
bool updateShouldNotify(LocaleInheritedWidget old) {
return old.currentLocale != currentLocale;
}

static LocaleInheritedWidget of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<LocaleInheritedWidget>()!;
}
}

class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);

Expand Down Expand Up @@ -123,7 +164,6 @@ class _HomePageState extends State<HomePage> {
clientId: '4564f6f7-335f-43d3-8867-a0f4e6f901d6',
redirectUri: FhirUri('com.legentix.faiagallery://callback'),
);

}

@override
Expand All @@ -134,7 +174,8 @@ class _HomePageState extends State<HomePage> {

/// Schedules repaint after login / logout.
void _onLoginChanged() {
_logger.debug('_onLoginChanged: ${questionnaireResponseStorage.smartClient.isLoggedIn()}');
_logger.debug(
'_onLoginChanged: ${questionnaireResponseStorage.smartClient.isLoggedIn()}');
setState(() {
// Rebuild
});
Expand Down Expand Up @@ -206,7 +247,8 @@ class _HomePageState extends State<HomePage> {
),
),
actions: [
SmartLoginButton(questionnaireResponseStorage.smartClient, onLoginChanged: _onLoginChanged)
SmartLoginButton(questionnaireResponseStorage.smartClient,
onLoginChanged: _onLoginChanged)
],
),
body: SafeArea(
Expand All @@ -225,7 +267,8 @@ class _HomePageState extends State<HomePage> {
launchContext: launchContext,
questionnairePath: 'assets/instruments/beverage_ig.json',
saveResponseFunction: questionnaireResponseStorage.saveToMemory,
restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory,
restoreResponseFunction:
questionnaireResponseStorage.restoreFromMemory,
uploadResponseFunction: uploadResponseFunction,
questionnaireModelDefaults: QuestionnaireModelDefaults(
prefixBuilder: (fim) {
Expand Down Expand Up @@ -396,7 +439,8 @@ class _HomePageState extends State<HomePage> {
launchContext: launchContext,
questionnairePath: 'assets/instruments/bluebook.json',
saveResponseFunction: questionnaireResponseStorage.saveToMemory,
restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory,
restoreResponseFunction:
questionnaireResponseStorage.restoreFromMemory,
uploadResponseFunction: uploadResponseFunction,
),
_launchQuestionnaire(
Expand Down Expand Up @@ -425,7 +469,8 @@ class _HomePageState extends State<HomePage> {
launchContext: launchContext,
questionnairePath: 'assets/instruments/argonaut_sampler.json',
saveResponseFunction: questionnaireResponseStorage.saveToMemory,
restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory,
restoreResponseFunction:
questionnaireResponseStorage.restoreFromMemory,
uploadResponseFunction: uploadResponseFunction,
),
QuestionnaireLaunchTile(
Expand All @@ -439,7 +484,8 @@ class _HomePageState extends State<HomePage> {
launchContext: launchContext,
questionnairePath: 'assets/instruments/argonaut_sampler.json',
saveResponseFunction: questionnaireResponseStorage.saveToMemory,
restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory,
restoreResponseFunction:
questionnaireResponseStorage.restoreFromMemory,
uploadResponseFunction: uploadResponseFunction,
),
QuestionnaireLaunchTile(
Expand All @@ -453,7 +499,8 @@ class _HomePageState extends State<HomePage> {
launchContext: launchContext,
questionnairePath: 'assets/instruments/argonaut_sampler.json',
saveResponseFunction: questionnaireResponseStorage.saveToMemory,
restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory,
restoreResponseFunction:
questionnaireResponseStorage.restoreFromMemory,
uploadResponseFunction: uploadResponseFunction,
),
_headline(
Expand Down
18 changes: 12 additions & 6 deletions example/lib/observation_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,18 @@ class ObservationPage extends ExhibitPage {
const SizedBox(
height: 16,
),
ObservationView(
bpObservationWHR,
valueStyle: Theme.of(context).textTheme.headline4,
codeStyle: Theme.of(context).textTheme.subtitle2,
dateTimeStyle: Theme.of(context).textTheme.caption,
locale: const Locale.fromSubtags(languageCode: 'ar', countryCode: 'BH'),
Localizations.override(
context: context,
locale: const Locale.fromSubtags(
languageCode: 'ar',
countryCode: 'BH',
),
child: ObservationView(
bpObservationWHR,
valueStyle: Theme.of(context).textTheme.headline4,
codeStyle: Theme.of(context).textTheme.subtitle2,
dateTimeStyle: Theme.of(context).textTheme.caption,
),
),
],
);
Expand Down
48 changes: 36 additions & 12 deletions example/lib/primitive_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,49 @@ class PrimitivePage extends ExhibitPage {
FhirDateTimeText(FhirDateTime('2010-02')),
const Spacer(),
Text('Germany', style: Theme.of(context).textTheme.headline6),
FhirDateTimeText(
FhirDateTime('2010-02-05 14:02'),
locale: const Locale.fromSubtags(languageCode: 'de', countryCode: 'DE'),
Localizations.override(
context: context,
locale: const Locale.fromSubtags(
languageCode: 'de',
countryCode: 'DE',
),
child: FhirDateTimeText(
FhirDateTime('2010-02-05 14:02'),
),
),
const Spacer(),
Text('Japan', style: Theme.of(context).textTheme.headline6),
FhirDateTimeText(
FhirDateTime('2010-02'),
locale: const Locale.fromSubtags(languageCode: 'ja', countryCode: 'JP'),
Localizations.override(
context: context,
locale: const Locale.fromSubtags(
languageCode: 'ja',
countryCode: 'JP',
),
child: FhirDateTimeText(
FhirDateTime('2010-02'),
),
),
FhirDateTimeText(
FhirDateTime('2010-02-05 14:02'),
locale: const Locale.fromSubtags(languageCode: 'ja', countryCode: 'JP'),
Localizations.override(
context: context,
locale: const Locale.fromSubtags(
languageCode: 'ja',
countryCode: 'JP',
),
child: FhirDateTimeText(
FhirDateTime('2010-02-05 14:02'),
),
),
const Spacer(),
Text('Bahrain', style: Theme.of(context).textTheme.headline6),
FhirDateTimeText(
FhirDateTime('2010-02-05 14:02'),
locale: const Locale.fromSubtags(languageCode: 'ar', countryCode: 'BH'),
Localizations.override(
context: context,
locale: const Locale.fromSubtags(
languageCode: 'ar',
countryCode: 'BH',
),
child: FhirDateTimeText(
FhirDateTime('2010-02-05 14:02'),
),
),
],
);
Expand Down
Loading

0 comments on commit f0680bc

Please sign in to comment.