-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[参考] テストの例 #59
Closed
Closed
[参考] テストの例 #59
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
3747abb
forceUpdateConfigをページに表示するまで
narunblog 0f1707e
強制アップデート時に表示するダイアログ作成
narunblog 90842a3
feat: temporarily remove cloud_firestore dependent fields
kosukesaigusa 2197550
build: add build_runner to generate mocks by mockito
kosukesaigusa 7c8577b
chore: fix provider name
kosukesaigusa e8dd09b
test: add force update widget test example
kosukesaigusa File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,9 +5,9 @@ | |
part of 'force_update_config.dart'; | ||
|
||
class ReadForceUpdateConfig { | ||
const ReadForceUpdateConfig._({ | ||
const ReadForceUpdateConfig({ | ||
required this.forceUpdateConfigId, | ||
required this.forceUpdateConfigReference, | ||
// required this.forceUpdateConfigReference, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 暫定対応としてコメントアウトした |
||
required this.iOSLatestVersion, | ||
required this.iOSMinRequiredVersion, | ||
required this.iOSForceUpdate, | ||
|
@@ -17,7 +17,7 @@ class ReadForceUpdateConfig { | |
}); | ||
|
||
final String forceUpdateConfigId; | ||
final DocumentReference<ReadForceUpdateConfig> forceUpdateConfigReference; | ||
// final DocumentReference<ReadForceUpdateConfig> forceUpdateConfigReference; | ||
final String iOSLatestVersion; | ||
final String iOSMinRequiredVersion; | ||
final bool iOSForceUpdate; | ||
|
@@ -26,10 +26,10 @@ class ReadForceUpdateConfig { | |
final bool androidForceUpdate; | ||
|
||
factory ReadForceUpdateConfig._fromJson(Map<String, dynamic> json) { | ||
return ReadForceUpdateConfig._( | ||
return ReadForceUpdateConfig( | ||
forceUpdateConfigId: json['forceUpdateConfigId'] as String, | ||
forceUpdateConfigReference: json['forceUpdateConfigReference'] | ||
as DocumentReference<ReadForceUpdateConfig>, | ||
// forceUpdateConfigReference: json['forceUpdateConfigReference'] | ||
// as DocumentReference<ReadForceUpdateConfig>, | ||
iOSLatestVersion: json['iOSLatestVersion'] as String, | ||
iOSMinRequiredVersion: json['iOSMinRequiredVersion'] as String, | ||
iOSForceUpdate: json['iOSForceUpdate'] as bool? ?? false, | ||
|
@@ -44,12 +44,12 @@ class ReadForceUpdateConfig { | |
return ReadForceUpdateConfig._fromJson(<String, dynamic>{ | ||
...data, | ||
'forceUpdateConfigId': ds.id, | ||
'forceUpdateConfigReference': | ||
ds.reference.parent.doc(ds.id).withConverter( | ||
fromFirestore: (ds, _) => | ||
ReadForceUpdateConfig.fromDocumentSnapshot(ds), | ||
toFirestore: (obj, _) => throw UnimplementedError(), | ||
), | ||
// 'forceUpdateConfigReference': | ||
// ds.reference.parent.doc(ds.id).withConverter( | ||
// fromFirestore: (ds, _) => | ||
// ReadForceUpdateConfig.fromDocumentSnapshot(ds), | ||
// toFirestore: (obj, _) => throw UnimplementedError(), | ||
// ), | ||
}); | ||
} | ||
|
||
|
@@ -63,10 +63,10 @@ class ReadForceUpdateConfig { | |
String? androidMinRequiredVersion, | ||
bool? androidForceUpdate, | ||
}) { | ||
return ReadForceUpdateConfig._( | ||
return ReadForceUpdateConfig( | ||
forceUpdateConfigId: forceUpdateConfigId ?? this.forceUpdateConfigId, | ||
forceUpdateConfigReference: | ||
forceUpdateConfigReference ?? this.forceUpdateConfigReference, | ||
// forceUpdateConfigReference: | ||
// forceUpdateConfigReference ?? this.forceUpdateConfigReference, | ||
iOSLatestVersion: iOSLatestVersion ?? this.iOSLatestVersion, | ||
iOSMinRequiredVersion: | ||
iOSMinRequiredVersion ?? this.iOSMinRequiredVersion, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import 'dart:io'; | ||
|
||
import 'package:firebase_common/firebase_common.dart'; | ||
import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||
|
||
import '../firestore_repository.dart'; | ||
import '../package_info.dart'; | ||
|
||
final forceUpdateStreamProvider = | ||
StreamProvider.autoDispose<ReadForceUpdateConfig?>((ref) { | ||
final repository = ref.watch(forceUpdateConfigRepositoryProvider); | ||
return repository.subscribeForceUpdateConfig(); | ||
}); | ||
|
||
final isForceUpdateProvider = Provider.autoDispose<bool>( | ||
(ref) { | ||
final forceUpdateInfo = ref.watch(forceUpdateStreamProvider).asData?.value; | ||
|
||
// 読み込みが終わっていない場合またはエラーの場合 | ||
if (forceUpdateInfo == null) { | ||
return false; | ||
} else { | ||
final packageInfo = ref.watch(packageInfoProvider); | ||
final isIOS = Platform.isIOS; | ||
final version = _formatVersionNumber(packageInfo.version); | ||
// iOSの時 | ||
if (isIOS) { | ||
// 強制アップデート | ||
if (forceUpdateInfo.iOSForceUpdate) { | ||
return true; | ||
} else { | ||
// バージョンが範囲内になければアップデート | ||
final iOSLatestVersion = | ||
_formatVersionNumber(forceUpdateInfo.iOSLatestVersion); | ||
final iOSMinRequiredVersion = | ||
_formatVersionNumber(forceUpdateInfo.iOSMinRequiredVersion); | ||
if (iOSMinRequiredVersion <= version && version <= iOSLatestVersion) { | ||
return false; | ||
} else { | ||
return true; | ||
} | ||
} | ||
// Androidの時 | ||
} else { | ||
// 強制アップデート | ||
if (forceUpdateInfo.androidForceUpdate) { | ||
return true; | ||
} else { | ||
// バージョンが範囲内になければアップデート | ||
final androidLatestVersion = | ||
_formatVersionNumber(forceUpdateInfo.androidLatestVersion); | ||
final androidMinRequiredVersion = | ||
_formatVersionNumber(forceUpdateInfo.androidMinRequiredVersion); | ||
if (androidMinRequiredVersion <= version && | ||
version <= androidLatestVersion) { | ||
return false; | ||
} else { | ||
return true; | ||
} | ||
} | ||
} | ||
} | ||
}, | ||
); | ||
|
||
int _formatVersionNumber(String version) { | ||
final sb = StringBuffer(); | ||
|
||
final versionNumbers = version.split('.'); | ||
|
||
sb.writeAll(versionNumbers); | ||
|
||
return int.parse(sb.toString()); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||
|
||
import '../force_update.dart'; | ||
|
||
class ForceUpdatePage extends ConsumerWidget { | ||
const ForceUpdatePage({super.key}); | ||
|
||
static const path = '/forceUpdate'; | ||
static const name = 'ForceUpdatePage'; | ||
static const location = name; | ||
|
||
@override | ||
Widget build(BuildContext context, WidgetRef ref) { | ||
return Scaffold( | ||
appBar: AppBar( | ||
title: const Text('フォースアップデート情報'), | ||
), | ||
body: ref.watch(forceUpdateStreamProvider).when( | ||
data: (forceUpdateConfig) => SingleChildScrollView( | ||
child: forceUpdateConfig != null | ||
? Column( | ||
mainAxisSize: MainAxisSize.min, | ||
children: [ | ||
ListTile( | ||
title: Text( | ||
forceUpdateConfig.androidForceUpdate.toString(), | ||
), | ||
subtitle: const Text('androidForceUpdate'), | ||
), | ||
ListTile( | ||
title: Text( | ||
forceUpdateConfig.androidLatestVersion, | ||
), | ||
subtitle: const Text('androidLatestVersion'), | ||
), | ||
ListTile( | ||
title: Text( | ||
forceUpdateConfig.androidMinRequiredVersion, | ||
), | ||
subtitle: const Text('androidMinRequiredVersion'), | ||
), | ||
ListTile( | ||
title: Text( | ||
forceUpdateConfig.iOSForceUpdate.toString(), | ||
), | ||
subtitle: const Text('iOSForceUpdate'), | ||
), | ||
ListTile( | ||
title: Text( | ||
forceUpdateConfig.iOSLatestVersion, | ||
), | ||
subtitle: const Text('iOSLatestVersion'), | ||
), | ||
ListTile( | ||
title: Text( | ||
forceUpdateConfig.iOSMinRequiredVersion, | ||
), | ||
subtitle: const Text('iOSMinRequiredVersion'), | ||
), | ||
ListTile( | ||
title: Text( | ||
ref.watch(isForceUpdateProvider).toString(), | ||
), | ||
subtitle: const Text('アップデートするかどうか'), | ||
), | ||
// if (ref.watch(isForceUpdateProvider)) | ||
ElevatedButton( | ||
onPressed: () async { | ||
await showDialog<Widget>( | ||
barrierDismissible: false, | ||
context: context, | ||
builder: (_) => const _ForceUpdateDialog(), | ||
); | ||
}, | ||
child: const Text('ダイアログ表示'), | ||
), | ||
], | ||
) | ||
: const SizedBox(), | ||
), | ||
error: (_, __) => const SizedBox(), | ||
loading: () => const Center(child: CircularProgressIndicator()), | ||
), | ||
); | ||
} | ||
} | ||
|
||
class _ForceUpdateDialog extends StatelessWidget { | ||
const _ForceUpdateDialog(); | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return AlertDialog( | ||
title: | ||
const Text('最新バージョンを App Store または Google Play Store でダウンロードしてください'), | ||
actions: <Widget>[ | ||
ElevatedButton( | ||
onPressed: () { | ||
Navigator.pop(context); | ||
// TODO:アプリAppStoreへ飛ばす処理を追加 | ||
}, | ||
child: const Text('App Store'), | ||
), | ||
ElevatedButton( | ||
onPressed: () { | ||
Navigator.pop(context); | ||
// TODO:アプリGoogle Play Storeへ飛ばす処理を追加 | ||
}, | ||
child: const Text('Google Play Store'), | ||
), | ||
], | ||
); | ||
} | ||
} |
Empty file.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
モックで差し替えたいので公開する通常のコンストラクタに変えた(flutterfire_gen でそのように生成されるように変える予定)