20.4.8 三
繼續(xù)講項(xiàng)目
點(diǎn)擊按鈕彈出Drawer
應(yīng)該是覆蓋上底部欄
下課試著做了出來(lái)
很簡(jiǎn)單
思路:
之前drawer寫(xiě)在JHHomeScreen中
包含下面的是MainScreen
給JHMainScreen一個(gè)drawer
導(dǎo)航上的按鈕是屬于JHHomeScreen
事件傳遞, 剛好是上層的
還有一個(gè)功能沒(méi)有做, 過(guò)濾
一些食品不喜歡, 過(guò)濾掉
學(xué)習(xí)思想, 項(xiàng)目架構(gòu)的思路
底部模態(tài)出選擇界面
創(chuàng)建filter文件夾, filter.dart
JHFilterScreen
filter_content.dart, JHFilterContent
路由, 默認(rèn)的方式彈出, push
自定義, 從下面彈出
generateRoute做一個(gè)監(jiān)聽(tīng)
如果setting.name == ... 做一些自定義
統(tǒng)一管理
改路由, 需要HotRestart
上面是固定
下面是滾動(dòng)列表
Column布局, 下半部占據(jù)剩余所有空間
Widget buildChoiceTitle() {}
Widget buildChoiceSelect() {}
返回一個(gè)ListView
hasSize報(bào)錯(cuò), shrinkWrap不用了, 換個(gè)寫(xiě)法
Expanded包裹一個(gè)ListView,
重復(fù)的東西抽取
Widget buildListTitle(String title, String subtitle, Function onChange)
布局完成后做一些事情
選中, 做過(guò)濾
三個(gè)界面
布爾類(lèi)型, 值在多個(gè)界面進(jìn)行共享
數(shù)據(jù)保存在哪里合適?
=> Provider MealViewModel
這樣做會(huì)出現(xiàn)問(wèn)題
相互依賴(lài), 耦合性太過(guò), 只是想使用布爾類(lèi)型, 卻要依賴(lài)整個(gè)ViewModel
=> 再搞一個(gè)FilterViewModel
生成setter嘲驾、getter, 快捷生成
Switch的value不要寫(xiě)死, 根據(jù)之前的選擇顯示
對(duì)meals數(shù)據(jù)進(jìn)行一個(gè)過(guò)濾 _meals.where((meal) {
//過(guò)濾
}).toList();
相互依賴(lài), 改一個(gè)代碼 JHMealViewModel依賴(lài)JHFilterViewModel
main.dart
ChangeNotifierProxyProvider
刪除JHMealViewModel,
有個(gè)update必傳參數(shù)
ChangeNotifierProxyProvider(
create: (ctx) => JHMealViewModel(),
update: (ctx, filterVM, mealVM) {
}
)
meal_view_model中
搞一個(gè)全局變量
void updateFilters(JHFilterViewModel filterVM) {
}
前面對(duì)返回false, 最終return true;
收藏沒(méi)有過(guò)濾掉,
如果需求就是這樣就沒(méi)有問(wèn)題
如果收藏也需要過(guò)濾掉
JHFavorViewModel依賴(lài)JHFilterViewModel
代碼都是拷貝的, 重復(fù)代碼 => 抽取
兩個(gè)類(lèi)里面有重復(fù)代碼 => 搞一個(gè)基類(lèi)
class BaseMealViewModel extends ChangeNotifer
notifyListenses()放在基類(lèi)中
過(guò)濾之后的meals生成新的對(duì)象
在搞一個(gè)getter, 拿原始的meals
originMeals {
return _meals;
}
多個(gè)Provider之間相互的依賴(lài)
Flutter沒(méi)有iOS中的ViewWillAppear
K appstore---大象期貨
國(guó)際化
i18n
在寫(xiě)一個(gè)簡(jiǎn)單的例子, 新建一個(gè)項(xiàng)目
想要做國(guó)際化, 根據(jù)當(dāng)前系統(tǒng)的語(yǔ)言
點(diǎn)擊按鈕顯示時(shí)間選擇器
里面的文本默認(rèn)顯示英文
希望在不同語(yǔ)言下顯示不同語(yǔ)言
當(dāng)前的語(yǔ)言就是中文, 沒(méi)有顯示中文
國(guó)際化的依賴(lài)
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
supportedLocales: [
Local("zh"),
Locale("en")
]
告訴Widget需要國(guó)際化
設(shè)置delegate
localizationsDelegates: [
GlobalWidgetsLocalizations.delegate
]
iOS非常的特殊
需要修改info.plist文件
i18n文件夾放所有國(guó)際化相關(guān)的東西
localizations.dart
class JHLocalizations {
static Map<String, Map<String, String>>
}
初始化對(duì)象的時(shí)候傳入一個(gè)local
localizations.dart
創(chuàng)建一個(gè)實(shí)例, 共享一個(gè)實(shí)例
參考MaterialApp的做法
isSupport判斷是否支持
顯示默認(rèn)的語(yǔ)言
shouldReload有點(diǎn)不好理解
load方法, 真正加載數(shù)據(jù)
資源是異步加載的, 返回Future
localizations_delegate.dart
抽取
static JHLocalization of(BuildContext context)
數(shù)據(jù)如果是放在服務(wù)器或json文件中, 異步加載
以json來(lái)舉例子
- 加載json文件
- 對(duì)json進(jìn)行解析
cast函數(shù)
抽到j(luò)son文件中還不是最優(yōu)的方案
getter還是要手動(dòng)寫(xiě)
最優(yōu)的方案: 將數(shù)據(jù)抽到arb文件中(應(yīng)用資源包)
開(kāi)發(fā)時(shí)依賴(lài)
AS的IDE插件
arb文件支持傳參數(shù)
執(zhí)行了shell腳本