The earlier nft repository was a Flutter starter template. Its name described that template, not a blockchain asset. The source recorded this toolchain:
[✓] Flutter (Channel stable, 1.22.3, on macOS 11.0.1 20B29, locale en-VN)
• Flutter version 1.22.3
• Framework revision 8874f21e79 (3 weeks ago), 2020-10-29 14:14:35 -0700
• Engine revision a1440ca392
• Dart version 2.10.3
Identity and launch assets
The setup changed the package name, display name, and bundle identifier, then aligned the Android source directory with the package. Those are different identifiers; a blind replacement is not proof that every platform configuration agrees.
flutter pub get
flutter pub run flutter_launcher_icons:main
+ android/app/src/main/res/drawable-mdpi
+ android/app/src/main/res/drawable-xhdpi
+ android/app/src/main/res/drawable-xxhdpi
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<item>
<bitmap
android:gravity="fill_horizontal|fill_vertical"
android:src="@drawable/launch_bg" />
</item>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/launch_image" />
</item>
</layer-list>
+ Expand View Controller Scene -> View Controller -> View
+ Add object -> Search ImageView -> Drag ImageView object to View (front of LaunchImage)
-> Select Attributes inspector -> Custom Image to LaunchBackground
-> Change View Content Mode to Scale To Fill -> Add 0, 0, 0, 0 as constrains
-> Save
Localization and structure
The template used Flutter Intl tooling and generated localization access:
Intl.getCurrentLocale()
S.load(Locale('vi'));
Widget build(BuildContext context) {
return Column(children: [
Text(
S.of(context).pageHomeConfirm,
),
Text(
S.current.pageHomeConfirm,// If you don't have `context` to pass
),
]);
}
#https://pub.dev/packages/intl_utils
flutter pub get
flutter pub run intl_utils:generate
Its source layout grouped generated files, configuration, shared code, and application areas:
lib/
|-generated/ ---> auto genrated by flutter_intl
|-I10n/ ---> place internalization files
|-intl_*.arb ---> define your translation text here
|-models/ ---> place object models
|-local/ ---> place local models
|-remote/ ---> place remote models
|-pages/ ---> define all pages/screens of application
|-home/ ---> place app home module included home ui and logic. We should organize as app module (eg: home, about, ...) rather then platform module (eg: activity, dialog, ...)
|-home_page.dart ---> define home ui
|-home_provider.dart ---> define home logic
|-services/ ---> place app services (database service, network service)
|-app/ ---> place local data services
|-app_dialog.dart ---> define app dialog service. Easy to show or hide alert dialog
|-app_loading.dart ---> define app loading service. Easy to show or hide loading view
|-dynamic_size.dart ---> define dynamic size service. Adapting screen and font size
|-locale_provider.dart ---> define locale provider service. Provide update locale
|-state_safety.dart ---> define sate safety service. It's used for Stateful widget, check mounted before setState
|-cache/ ---> place local data services
|-credential.dart ---> define app credential
|-storage.dart ---> define storage service
|-storage_preferences.dart ---> define storage with shared preferences service
|-rest_api/ ---> place remote services
|-api.dart ---> define api base class
|-api_error.dart ---> define api error/exception handler
|-api_user.dart ---> define sample of api user
|-error_type.dart ---> define api error type
|-safety/ ---> place safety abstract class for widget, change notifier
|-base_stateful.dart ---> define base stateful widget, provide app theme, dynamic size
|-base_stateless.dart ---> define base stateless widget, provide app theme, dynamic size
|-change_notifier_safety.dart---> define safety change notifier
|-page_stateful.dart ---> define stateful abstract for page
|-state_safety.dart ---> define setState safety
|-store/ ---> place local store service
|-store.dart ---> define abstract store
|-store_mock.dart ---> define mock store
|-utils/ ---> place app utils
|-app_asset.dart ---> define app assets
|-app_config.dart ---> define app config multi environment
|-app_extension.dart ---> define app extension
|-app_helper.dart ---> define app helper. Provide util function such as show popup, toast, flushbar, orientation mode
|-app_log.dart ---> define app logger. Log safety with production mode
|-app_route.dart ---> define app route logic
|-app_style.dart ---> define app style
|-app_theme.dart ---> define app theme. Provide multi theme such as dart, light
|-widgets/ ---> place app widgets
|-p_appbar_empty.dart ---> define wrapper widget use for page, color status bar but empty appbar
|-p_appbar_transparency.dart ---> define wrapper widget use for page, transparent status bar
|-p_material.dart ---> define wrapper widget use for page, provide material app block
|-w_dismiss_keyboard.dart ---> define component widget with auto dismiss keyboard when click on screen
|-main.dart ---> each main.dart file point to each env of app. Ex: default main.dart for dev env, create new main_prod.dart for prod env
|-my_app.dart ---> application bootstrap
test/ ---> place app unit, widget tests
|-counter_provider_test.dart ---> define test provider script
|-counter_widget_test.dart ---> define test widget script
|-navigator_test.dart ---> define test navigator script
|-rest_api_test.dart ---> define test rest api script
test_driver/ ---> place integration testing
|-app.dart ---> define application bootstrap for integration testing
|-app_test.dart ---> define integration test script
The tree is a historical example, not a requirement to create every listed abstraction in a new project.
Versions and environments
version: 1.0.6+2003271407
---
Version name: 1.0.6
Version code: 2003271407
# default as dev
flutter build ios
# prod
flutter build ios -t lib/main_prod.dart
The source used a timestamp-like build-number convention and separate environment entry points. Platform build-number limits and secret handling still require review.
Tests and release preparation
flutter test
# Test and export coverage information
# output to coverage/lcov.info
flutter test --coverage
# Convert to html
## Install lcov tool to convert lcov.info file to HTML pages
- Installing in Ubuntu:
sudo apt-get update -qq -y
sudo apt-get install lcov -y
- Installing in Mac:
brew install lcov
- Gen html files
genhtml coverage/lcov.info -o coverage/html
# Open in the default browser (mac):
open coverage/html/index.html
flutter drive --target=test_driver/app.dart
These are the original test commands, not tests executed during this migration. The older driver setup differs from current integration tooling.
Android signing and build references were:
keyAlias=
keyPassword=
storePassword=
storeFile=keystores/keystore-release.jks
#KEY INFO
#CN(first and last name):
#OU(organizational unit):
#O(organization):
#L(City or Locality):
#ST(State or Province):
#C(country code):
cd android/app/keystores/
export keyAlias=
export keyPassword=
export storePassword=
keytool -genkey -v -keystore keystore-release.jks -alias $keyAlias -keyalg RSA -keysize 2048 -validity 1000000 -storepass $storePassword -keypass $keyPassword
flutter build apk
flutter build appbundle
iOS required its own signing identity, provisioning, archive, and upload flow:
flutter build ios
The original checklist also covered formatting, naming, version updates, release-mode verification, and distribution. It linked a semantic-commit reference, which was unavailable during this retrieval; no contents from that reference are invented here. App Center-era CI compatibility and prior test claims are historical.
Source: original template repository. No keys, profiles, builds, tests, or store submissions were created for this revision.