美文网首页
Flutter从入门到写出完整App Day17

Flutter从入门到写出完整App Day17

作者: JackLeeVip | 来源:发表于2020-06-22 23:38 被阅读0次

    20.4.8 三

    继续讲项目
    点击按钮弹出Drawer
    应该是覆盖上底部栏
    下课试着做了出来
    很简单

    思路:
    之前drawer写在JHHomeScreen中
    包含下面的是MainScreen
    给JHMainScreen一个drawer
    导航上的按钮是属于JHHomeScreen
    事件传递, 刚好是上层的

    还有一个功能没有做, 过滤
    一些食品不喜欢, 过滤掉
    学习思想, 项目架构的思路

    底部模态出选择界面
    创建filter文件夹, filter.dart
    JHFilterScreen
    filter_content.dart, JHFilterContent
    路由, 默认的方式弹出, push
    自定义, 从下面弹出
    generateRoute做一个监听
    如果setting.name == ... 做一些自定义
    统一管理
    改路由, 需要HotRestart

    上面是固定
    下面是滚动列表
    Column布局, 下半部占据剩余所有空间
    Widget buildChoiceTitle() {}

    Widget buildChoiceSelect() {}
    返回一个ListView
    hasSize报错, shrinkWrap不用了, 换个写法
    Expanded包裹一个ListView,
    重复的东西抽取
    Widget buildListTitle(String title, String subtitle, Function onChange)

    布局完成后做一些事情
    选中, 做过滤
    三个界面
    布尔类型, 值在多个界面进行共享
    数据保存在哪里合适?
    => Provider MealViewModel
    这样做会出现问题
    相互依赖, 耦合性太过, 只是想使用布尔类型, 却要依赖整个ViewModel

    => 再搞一个FilterViewModel

    生成setter、getter, 快捷生成
    Switch的value不要写死, 根据之前的选择显示

    对meals数据进行一个过滤 _meals.where((meal) {
    //过滤
    }).toList();
    相互依赖, 改一个代码 JHMealViewModel依赖JHFilterViewModel
    main.dart
    ChangeNotifierProxyProvider
    删除JHMealViewModel,
    有个update必传参数
    ChangeNotifierProxyProvider(
    create: (ctx) => JHMealViewModel(),
    update: (ctx, filterVM, mealVM) {

    }
    

    )

    meal_view_model中
    搞一个全局变量
    void updateFilters(JHFilterViewModel filterVM) {
    }
    前面对返回false, 最终return true;

    收藏没有过滤掉,
    如果需求就是这样就没有问题
    如果收藏也需要过滤掉
    JHFavorViewModel依赖JHFilterViewModel
    代码都是拷贝的, 重复代码 => 抽取
    两个类里面有重复代码 => 搞一个基类
    class BaseMealViewModel extends ChangeNotifer
    notifyListenses()放在基类中

    过滤之后的meals生成新的对象

    在搞一个getter, 拿原始的meals
    originMeals {
    return _meals;
    }

    多个Provider之间相互的依赖

    Flutter没有iOS中的ViewWillAppear

    K appstore---大象期货

    国际化

    i18n
    在写一个简单的例子, 新建一个项目

    想要做国际化, 根据当前系统的语言
    点击按钮显示时间选择器
    里面的文本默认显示英文
    希望在不同语言下显示不同语言
    当前的语言就是中文, 没有显示中文
    国际化的依赖
    flutter:
    sdk: flutter
    flutter_localizations:
    sdk: flutter

    supportedLocales: [
    Local("zh"),
    Locale("en")
    ]
    告诉Widget需要国际化
    设置delegate
    localizationsDelegates: [
    GlobalWidgetsLocalizations.delegate
    ]

    iOS非常的特殊
    需要修改info.plist文件

    i18n文件夹放所有国际化相关的东西
    localizations.dart
    class JHLocalizations {
    static Map<String, Map<String, String>>
    }
    初始化对象的时候传入一个local

    localizations.dart

    创建一个实例, 共享一个实例
    参考MaterialApp的做法

    isSupport判断是否支持
    显示默认的语言
    shouldReload有点不好理解
    load方法, 真正加载数据
    资源是异步加载的, 返回Future

    localizations_delegate.dart

    抽取
    static JHLocalization of(BuildContext context)

    数据如果是放在服务器或json文件中, 异步加载
    以json来举例子

    1. 加载json文件
    2. 对json进行解析
      cast函数

    抽到json文件中还不是最优的方案
    getter还是要手动写
    最优的方案: 将数据抽到arb文件中(应用资源包)
    开发时依赖
    AS的IDE插件
    arb文件支持传参数
    执行了shell脚本

    相关文章

      网友评论

          本文标题:Flutter从入门到写出完整App Day17

          本文链接:https://www.haomeiwen.com/subject/qpuqfktx.html