Yukseltme Rehberi
v7'deki Yenilikler
Nylo Website v7, gelistirici deneyiminde onemli iyilestirmeler iceren buyuk bir surumdur:
Sifrelenmis Ortam Yapilandirmasi
- Ortam degiskenleri artik guvenlik icin derleme zamaninda XOR ile sifreleniyor
- Yeni
metro make:keykomutu APP_KEY'inizi olusturur - Yeni
metro make:envkomutu sifrelenmisenv.g.dartdosyasini olusturur - CI/CD surecleri icin
--dart-defineile APP_KEY enjeksiyonu destegi
Basitlestirilmis Baslatma Sureci
- Yeni
BootConfigdeseni ayri setup/finished callback'lerinin yerini alir - Sifrelenmis ortam icin
envparametresiyle daha temizNylo.init() - Uygulama yasam dongusu hook'lari dogrudan main.dart'ta
Yeni nylo.configure() API'si
- Tek bir metot tum uygulama yapilandirmasini birlestirir
- Daha temiz sozdizimi bireysel
nylo.add*()cagrilarinin yerini alir - Provider'larda ayri
setup()veboot()yasam dongusu metotlari
Sayfalar icin NyPage
NyPage, sayfa widget'lari icinNyState'in yerini alir (daha temiz sozdizimi)view(),build()metodunun yerini alirget init =>getter'iinit()veboot()metotlarinin yerini alirNyState, sayfa olmayan stateful widget'lar icin hala kullanilabilir
LoadingStyle Sistemi
- Tutarli yukleme durumlari icin yeni
LoadingStyleenum'u - Secenekler:
LoadingStyle.normal(),LoadingStyle.skeletonizer(),LoadingStyle.none() LoadingStyle.normal(child: ...)ile ozel yukleme widget'lari
RouteView Tip Guvenlikli Yonlendirme
static RouteView path,static const path'in yerini alir- Widget factory ile tip guvenlikli route tanimlamalari
Coklu Theme Destegi
- Birden fazla koyu ve acik theme kaydetme
- Theme ID'leri
.envdosyasi yerine kodda tanimlanir - Theme siniflandirmasi icin yeni
NyThemeType.dark/NyThemeType.light - Tercih edilen theme API'si:
NyTheme.setPreferredDark(),NyTheme.setPreferredLight() - Theme numaralandirmasi:
NyTheme.lightThemes(),NyTheme.darkThemes(),NyTheme.all()
Yeni Metro Komutlari
make:key- Sifreleme icin APP_KEY olustururmake:env- Sifrelenmis ortam dosyasi olustururmake:bottom_sheet_modal- Bottom sheet modal'lari olustururmake:button- Ozel button'lar olusturur
Tum degisiklikleri GitHub'da goruntuleyin
Uyumsuz Degisikliklere Genel Bakis
| Degisiklik | v6 | v7 |
|---|---|---|
| Uygulama Kok Widget'i | LocalizedApp(child: Main(nylo)) |
Main(nylo) (NyApp.materialApp() kullanir) |
| Sayfa State Sinifi | NyState |
Sayfalar icin NyPage |
| View Metodu | build() |
view() |
| Init Metodu | init() async {} / boot() async {} |
get init => () async {} |
| Route Yolu | static const path = '/home' |
static RouteView path = ('/home', (_) => HomePage()) |
| Provider Boot | boot(Nylo nylo) |
setup(Nylo nylo) + boot(Nylo nylo) |
| Yapilandirma | Bireysel nylo.add*() cagrilari |
Tek nylo.configure() cagrisi |
| Theme ID'leri | .env dosyasi (LIGHT_THEME_ID, DARK_THEME_ID) |
Kod (type: NyThemeType.dark) |
| Yukleme Widget'i | useSkeletonizer + loading() |
LoadingStyle getter |
| Yapilandirma Konumu | lib/config/ |
lib/bootstrap/ (decoders, events, providers, theme) |
| Varlik Konumu | public/ |
assets/ |
Onerilen Gecis Yaklasimi
Daha buyuk projeler icin, yeni bir v7 projesi olusturup dosyalari tasimanizi oneririz:
- Yeni v7 projesi olusturun:
git clone https://github.com/nylo-core/nylo.git my_app_v7 -b 7.x - Sayfa, controller, model ve servislerinizi kopyalayin
- Yukarida gosterildigi gibi sozdizimini guncelleyin
- Kapsamli bir sekilde test edin
Bu, en son sablon yapisina ve yapilandirmalara sahip olmanizi saglar.
v6 ve v7 arasindaki degisikliklerin bir farkini gormek istiyorsaniz, GitHub'daki karsilastirmayi goruntuleyebilirsiniz: https://github.com/nylo-core/nylo/compare/6.x...7.x
Hizli Gecis Kontrol Listesi
Gecis ilerlemenizi takip etmek icin bu kontrol listesini kullanin:
-
pubspec.yamlguncelle (Dart >=3.10.7, Flutter >=3.24.0, nylo_framework: ^7.0.0) -
flutter pub getcalistir - APP_KEY olusturmak icin
metro make:keycalistir - Sifrelenmis ortam olusturmak icin
metro make:envcalistir -
main.dart'i env parametresi ve BootConfig ile guncelle -
BootsinifiniBootConfigdesenini kullanacak sekilde donustur - Yapilandirma dosyalarini
lib/config/'denlib/bootstrap/'a tasi - Yeni yapilandirma dosyalari olustur (
lib/config/app.dart,lib/config/storage_keys.dart,lib/config/toast_notification.dart) -
AppProvider'inylo.configure()kullanacak sekilde guncelle -
.env'denLIGHT_THEME_IDveDARK_THEME_ID'yi kaldir - Koyu theme yapilandirmalarina
type: NyThemeType.darkekle - Tum sayfa widget'lari icin
NyState'iNyPageolarak yeniden adlandir - Tum sayfalarda
build()'iview()olarak degistir - Tum sayfalarda
init()/boot()'uget init =>olarak degistir -
static const path'istatic RouteView patholarak guncelle - Route'larda
router.route()'urouter.add()olarak degistir - Widget'lari yeniden adlandir (NyListView -> CollectionView, vb.)
- Varliklari
public/'denassets/'e tasi -
pubspec.yamlvarlik yollarini guncelle - Firebase import'larini kaldir (kullaniyorsaniz - paketleri dogrudan ekleyin)
- NyDevPanel kullanimini kaldir (Flutter DevTools kullanin)
-
flutter pub getcalistir ve test et
Adim Adim Gecis Rehberi
Adim 1: Bagimliliklari Guncelleme
pubspec.yaml dosyanizi guncelleyin:
environment:
sdk: '>=3.10.7 <4.0.0'
flutter: ">=3.24.0"
dependencies:
nylo_framework: ^7.0.0
# ... diger bagimliliklar
Paketleri guncellemek icin flutter pub get calistirin.
Adim 2: Ortam Yapilandirmasi
v7, gelistirilmis guvenlik icin sifrelenmis ortam degiskenleri gerektirir.
1. APP_KEY Olusturma:
metro make:key
Bu, .env dosyaniza APP_KEY ekler.
2. Sifrelenmis env.g.dart Olusturma:
metro make:env
Bu, sifrelenmis ortam degiskenlerinizi iceren lib/bootstrap/env.g.dart dosyasini olusturur.
3. Kullanimdan kaldirilan theme degiskenlerini .env'den kaldirin:
# Bu satirlari .env dosyanizdan kaldirin:
LIGHT_THEME_ID=...
DARK_THEME_ID=...
Adim 3: main.dart Guncelleme
v6:
import 'package:nylo_framework/nylo_framework.dart';
import 'bootstrap/boot.dart';
void main() async {
await Nylo.init(
setup: Boot.nylo,
setupFinished: Boot.finished,
);
}
v7:
import '/bootstrap/env.g.dart';
import 'package:nylo_framework/nylo_framework.dart';
import 'bootstrap/boot.dart';
void main() async {
await Nylo.init(
env: Env.get,
setup: Boot.nylo(),
appLifecycle: {
// Istege bagli: Uygulama yasam dongusu hook'lari ekleyin
// AppLifecycleState.resumed: () => print("App resumed"),
// AppLifecycleState.paused: () => print("App paused"),
},
);
}
Temel Degisiklikler:
- Olusturulan
env.g.dartdosyasini import edin envparametresineEnv.getiletinBoot.nyloartikBoot.nylo()(BootConfigdondurur)setupFinishedkaldirildi (BootConfigicinde ele aliniyor)- Uygulama durum degisiklikleri icin istege bagli
appLifecyclehook'lari
Adim 4: boot.dart Guncelleme
v6:
class Boot {
static Future<Nylo> nylo() async {
WidgetsFlutterBinding.ensureInitialized();
if (getEnv('SHOW_SPLASH_SCREEN', defaultValue: false)) {
runApp(SplashScreen.app());
}
await _setup();
return await bootApplication(providers);
}
static Future<void> finished(Nylo nylo) async {
await bootFinished(nylo, providers);
runApp(Main(nylo));
}
}
v7:
class Boot {
static BootConfig nylo() => BootConfig(
setup: () async {
WidgetsFlutterBinding.ensureInitialized();
if (AppConfig.showSplashScreen) {
runApp(SplashScreen.app());
}
await _init();
return await setupApplication(providers);
},
boot: (Nylo nylo) async {
await bootFinished(nylo, providers);
runApp(Main(nylo));
},
);
}
Temel Degisiklikler:
Future<Nylo>yerineBootConfigdondurursetupvefinishedtekBootConfignesnesinde birlestirildigetEnv('SHOW_SPLASH_SCREEN')->AppConfig.showSplashScreenbootApplication->setupApplication
Adim 5: Yapilandirma Dosyalarini Yeniden Duzenleme
v7, daha iyi yapi icin yapilandirma dosyalarini yeniden duzenler:
| v6 Konumu | v7 Konumu | Islem |
|---|---|---|
lib/config/decoders.dart |
lib/bootstrap/decoders.dart |
Tasi |
lib/config/events.dart |
lib/bootstrap/events.dart |
Tasi |
lib/config/providers.dart |
lib/bootstrap/providers.dart |
Tasi |
lib/config/theme.dart |
lib/bootstrap/theme.dart |
Tasi |
lib/config/keys.dart |
lib/config/storage_keys.dart |
Yeniden Adlandir ve Refaktor Et |
| (yeni) | lib/config/app.dart |
Olustur |
| (yeni) | lib/config/toast_notification.dart |
Olustur |
lib/config/app.dart Olusturma:
Referans: App Config
class AppConfig {
// Uygulamanin adi.
static final String appName = getEnv('APP_NAME', defaultValue: 'Nylo');
// Uygulamanin versiyonu.
static final String version = getEnv('APP_VERSION', defaultValue: '1.0.0');
// Buraya diger uygulama yapilandirmalarini ekleyin
}
lib/config/storage_keys.dart Olusturma:
Referans: Storage Keys
final class StorageKeysConfig {
// Boot sirasinda senkronize edilecek anahtarlari tanimlayin
static syncedOnBoot() => () async {
return [
auth,
bearerToken,
// coins.defaultValue(10), // kullaniciya varsayilan olarak 10 jeton verin
];
};
static StorageKey auth = 'SK_USER';
static StorageKey bearerToken = 'SK_BEARER_TOKEN';
// static StorageKey coins = 'SK_COINS';
/// Storage key'lerinizi buraya ekleyin...
}
lib/config/toast_notification.dart Olusturma:
Referans: Toast Notification Config
import 'package:nylo_framework/nylo_framework.dart';
class ToastNotificationConfig {
static Map<ToastNotificationStyleMetaHelper, ToastMeta> styles = {
// Toast stillerini burada ozellestirin
};
}
Adim 6: AppProvider Guncelleme
v6:
class AppProvider implements NyProvider {
@override
boot(Nylo nylo) async {
await NyLocalization.instance.init(
localeType: localeType,
languageCode: languageCode,
assetsDirectory: assetsDirectory,
);
nylo.addLoader(loader);
nylo.addLogo(logo);
nylo.addThemes(appThemes);
nylo.addToastNotification(getToastNotificationWidget);
nylo.addValidationRules(validationRules);
nylo.addModelDecoders(modelDecoders);
nylo.addControllers(controllers);
nylo.addApiDecoders(apiDecoders);
nylo.useErrorStack();
nylo.addAuthKey(Keys.auth);
await nylo.syncKeys(Keys.syncedOnBoot);
return nylo;
}
@override
afterBoot(Nylo nylo) async {}
}
v7:
class AppProvider implements NyProvider {
@override
setup(Nylo nylo) async {
await nylo.configure(
localization: NyLocalizationConfig(
languageCode: LocalizationConfig.languageCode,
localeType: LocalizationConfig.localeType,
assetsDirectory: LocalizationConfig.assetsDirectory,
),
loader: DesignConfig.loader,
logo: DesignConfig.logo,
themes: appThemes,
initialThemeId: 'light_theme',
toastNotifications: ToastNotificationConfig.styles,
modelDecoders: modelDecoders,
controllers: controllers,
apiDecoders: apiDecoders,
authKey: StorageKeysConfig.auth,
syncKeys: StorageKeysConfig.syncedOnBoot,
useErrorStack: true,
);
return nylo;
}
@override
boot(Nylo nylo) async {}
}
Temel Degisiklikler:
- Ilk yapilandirma icin
boot()artiksetup()oldu boot()artik kurulum sonrasi mantik icin kullaniliyor (oncedenafterBoot)- Tum
nylo.add*()cagrilari teknylo.configure()icinde birlestirildi - Yerellestirme
NyLocalizationConfignesnesi kullaniyor
Adim 7: Theme Yapilandirmasini Guncelleme
v6 (.env dosyasi):
LIGHT_THEME_ID=default_light_theme
DARK_THEME_ID=default_dark_theme
v6 (theme.dart):
final List<BaseThemeConfig> appThemes = [
BaseThemeConfig(
id: getEnv('LIGHT_THEME_ID'),
description: "Light Theme",
theme: lightTheme(),
colors: LightThemeColors(),
),
BaseThemeConfig(
id: getEnv('DARK_THEME_ID'),
description: "Dark Theme",
theme: darkTheme(),
colors: DarkThemeColors(),
),
];
v7 (theme.dart):
final List<BaseThemeConfig<ColorStyles>> appThemes = [
BaseThemeConfig<ColorStyles>(
id: 'light_theme',
theme: lightTheme,
colors: LightThemeColors(),
type: NyThemeType.light,
),
BaseThemeConfig<ColorStyles>(
id: 'dark_theme',
theme: darkTheme,
colors: DarkThemeColors(),
type: NyThemeType.dark,
),
];
Temel Degisiklikler:
.env'denLIGHT_THEME_IDveDARK_THEME_ID'yi kaldirin- Theme ID'lerini dogrudan kodda tanimlayin
- Tum koyu theme yapilandirmalarina
type: NyThemeType.darkekleyin - Acik theme'ler varsayilan olarak
NyThemeType.light
Yeni Theme API Metotlari (v7):
// Tercih edilen theme'i ayarla ve hatirla
NyTheme.set(context, id: 'dark_theme', remember: true);
// Sistem takibi icin tercih edilen theme'leri ayarla
NyTheme.setPreferredDark('dark_theme');
NyTheme.setPreferredLight('light_theme');
// Tercih edilen theme ID'lerini al
String? darkId = NyTheme.preferredDarkId();
String? lightId = NyTheme.preferredLightId();
// Theme numaralandirmasi
List<BaseThemeConfig> lights = NyTheme.lightThemes();
List<BaseThemeConfig> darks = NyTheme.darkThemes();
List<BaseThemeConfig> all = NyTheme.all();
BaseThemeConfig? theme = NyTheme.getById('dark_theme');
List<BaseThemeConfig> byType = NyTheme.getByType(NyThemeType.dark);
// Kaydedilmis tercihleri temizle
NyTheme.clearSavedTheme();
Adim 10: Widget'lari Tasima
NyListView -> CollectionView
v6:
NyListView(
child: (context, data) {
return ListTile(title: Text(data.name));
},
data: () async => await api.getUsers(),
loading: CircularProgressIndicator(),
)
v7:
CollectionView<User>(
data: () async => await api.getUsers(),
builder: (context, item) => ListTile(
title: Text(item.data.name),
),
loadingStyle: LoadingStyle.normal(),
)
// Sayfalama ile (cekerek yenileme):
CollectionView<User>.pullable(
data: (page) async => await api.getUsers(page: page),
builder: (context, item) => ListTile(
title: Text(item.data.name),
),
)
NyFutureBuilder -> FutureWidget
v6:
NyFutureBuilder(
future: fetchData(),
child: (context, data) => Text(data),
loading: CircularProgressIndicator(),
)
v7:
FutureWidget<String>(
future: fetchData(),
child: (context, data) => Text(data ?? ''),
loadingStyle: LoadingStyle.normal(),
)
NyTextField -> InputField
v6:
NyTextField(
controller: _controller,
validationRules: "not_empty|email",
)
v7:
InputField(
controller: _controller,
formValidator: FormValidator
.notEmpty()
.email(),
),
NyRichText -> StyledText
v6:
NyRichText(children: [
Text("Hello", style: TextStyle(color: Colors.yellow)),
Text(" WORLD ", style: TextStyle(color: Colors.blue)),
Text("!", style: TextStyle(color: Colors.red)),
]),
v7:
StyledText.template(
"{{Hello}} {{WORLD}}{{!}}",
styles: {
"Hello": TextStyle(color: Colors.yellow),
"WORLD": TextStyle(color: Colors.blue),
"!": TextStyle(color: Colors.red),
},
)
NyLanguageSwitcher -> LanguageSwitcher
v6:
NyLanguageSwitcher(
onLanguageChange: (locale) => print(locale),
)
v7:
LanguageSwitcher(
onLanguageChange: (locale) => print(locale),
)
Adim 11: Varlik Yollarini Guncelleme
v7, varlik dizinini public/'den assets/'e degistirir:
1. Varlik klasorlerinizi tasiyin:
# Dizinleri tasi
mv public/fonts assets/fonts
mv public/images assets/images
mv public/app_icon assets/app_icon
2. pubspec.yaml'i guncelleyin:
v6:
flutter:
assets:
- public/fonts/
- public/images/
- public/app_icon/
v7:
flutter:
assets:
- assets/fonts/
- assets/images/
- assets/app_icon/
3. Koddaki varlik referanslarini guncelleyin:
v6:
Image.asset('public/images/logo.png')
v7:
Image.asset('assets/images/logo.png')
LocalizedApp Widget'i - Kaldirildi
Referans: Main Widget
Gecis: Main(nylo)'yu dogrudan kullanin. NyApp.materialApp() yerellestirmeyi dahili olarak isler.
v6:
runApp(LocalizedApp(child: Main(nylo)));
v7:
runApp(Main(nylo));
Silinen Siniflar Referansi
| Silinen Sinif | Alternatif |
|---|---|
NyTextStyle |
Flutter'in TextStyle'ini dogrudan kullanin |
NyBaseApiService |
DioApiService kullanin |
BaseColorStyles |
ThemeColor kullanin |
LocalizedApp |
Main(nylo)'yu dogrudan kullanin |
NyException |
Standart Dart exception'larini kullanin |
PushNotification |
flutter_local_notifications'i dogrudan kullanin |
PushNotificationAttachments |
flutter_local_notifications'i dogrudan kullanin |
Widget Gecis Referansi
Yeniden Adlandirilan Widget'lar
| v6 Widget | v7 Widget | Notlar |
|---|---|---|
NyListView |
CollectionView |
child yerine builder ile yeni API |
NyFutureBuilder |
FutureWidget |
Basitlestirilmis async widget |
NyTextField |
InputField |
FormValidator kullanir |
NyLanguageSwitcher |
LanguageSwitcher |
Ayni API |
NyRichText |
StyledText |
Ayni API |
NyFader |
FadeOverlay |
Ayni API |
Silinen Widget'lar (Dogrudan Alternatifi Yok)
| Silinen Widget | Alternatif |
|---|---|
NyPullToRefresh |
CollectionView.pullable() kullanin |
Widget Gecis Ornekleri
NyPullToRefresh -> CollectionView.pullable():
v6:
NyPullToRefresh(
child: (context, data) => ListTile(title: Text(data.name)),
data: (page) async => await fetchData(page),
)
v7:
CollectionView<MyModel>.pullable(
data: (page) async => await fetchData(page),
builder: (context, item) => ListTile(title: Text(item.data.name)),
)
NyFader -> FadeOverlay:
v6:
NyFader(
child: MyWidget(),
)
v7:
FadeOverlay.bottom(
child: MyWidget(),
);
Sorun Giderme
"Env.get not found" veya "Env is not defined"
Cozum: Ortam olusturma komutlarini calistirin:
metro make:key
metro make:env
Ardindan olusturulan dosyayi main.dart'a import edin:
import '/bootstrap/env.g.dart';
"Theme not applying" veya "Dark theme not working"
Cozum: Koyu theme'lerin type: NyThemeType.dark icerdiginden emin olun:
BaseThemeConfig(
id: 'dark_theme',
description: "Dark Theme",
theme: darkTheme(),
colors: DarkThemeColors(),
type: NyThemeType.dark, // Bu satiri ekleyin
),
"LocalizedApp not found"
Referans: Main Widget
Cozum: LocalizedApp kaldirildi. Su sekilde degistirin:
// Bundan:
runApp(LocalizedApp(child: Main(nylo)));
// Buna:
runApp(Main(nylo));
"router.route is not defined"
Cozum: Bunun yerine router.add() kullanin:
// Bundan:
router.route(HomePage.path, (context) => HomePage());
// Buna:
router.add(HomePage.path);
"NyListView not found"
Cozum: NyListView artik CollectionView:
// Bundan:
NyListView(...)
// Buna:
CollectionView<MyModel>(...)
Varliklar yuklenmiyor (resimler, fontlar)
Cozum: Varlik yollarini public/'den assets/'e guncelleyin:
- Dosyalari tasiyin:
mv public/* assets/ pubspec.yamlyollarini guncelleyin- Kod referanslarini guncelleyin
"init() must return a value of type Future"
Cozum: Getter sozdizimne gecin:
// Bundan:
@override
init() async { ... }
// Buna:
@override
get init => () async { ... };
Yardima mi ihtiyaciniz var? Nylo Dokumantasyonu'nu kontrol edin veya GitHub'da bir issue acin.