欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flutter TV Android端開(kāi)發(fā)技巧詳細(xì)教程

 更新時(shí)間:2022年12月09日 15:14:32   作者:Asscre  
這篇文章主要為大家介紹了Flutter TV Android端開(kāi)發(fā)技巧詳細(xì)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

最近公司有了新的業(yè)務(wù),把現(xiàn)有Flutter Android項(xiàng)目應(yīng)用到TV上去,這不,Asscre的活就來(lái)了。

本文詳細(xì)說(shuō)明Flutter for TV的兩種實(shí)現(xiàn)方式,能力有限,不足之處歡迎指點(diǎn),哈哈哈

開(kāi)發(fā)思路

在開(kāi)發(fā)之前,我們先設(shè)定一下我們的思路。

即,如何對(duì)原有程序代碼侵入式最小、性能最佳、可玩性更高做出設(shè)定。

那么,通過(guò)上面的設(shè)定,我們?cè)贔lutter Widget中就發(fā)現(xiàn)了兩個(gè)東西:

  • RawKeyboardListener
  • InkWell和其他Android TV配置

先上效果

可玩性、可塑性更高的RawKeyboardListener解決方案效果

對(duì)原有程序修改最小的InkWell和其他Android TV配置解決方案效果

開(kāi)發(fā)細(xì)節(jié)

可玩性、可塑性更高的RawKeyboardListener解決方案

使用RawKeyboardListener

RawKeyboardListener(
  focusNode: d.focusNode, // 配置focusNode
  onKey: (RawKeyEvent event) =>
      context.read<HomePageContentWidgetProvider>().focusEventHandler(event, context, d), // 對(duì)特殊事件進(jìn)行監(jiān)聽(tīng)和處理
  child: Container(
    height: 190,
    width: 190,
    decoration: BoxDecoration(
      border: Border.all(
          width: 2,
          color: d.focusNode.hasFocus ? Colors.blue : Colors.transparent),
      borderRadius: BorderRadius.circular(20),
      color: Colors.white.withAlpha(20),
    ),
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Image.asset(
          d.img,
          height: 80,
        ),
        SizedBox(height: 20),
        Text(
          d.name,
          style: TextStyle(
            color: Colors.white,
            fontSize: 32,
          ),
        ),
      ],
    ),
  ),
),

Provider層對(duì)事件進(jìn)行處理

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:tv_test/pages/memory_page/memory_page.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class HomePageContentWidgetProvider
    with ChangeNotifier {
  bool init = false;
  double maxWScreen = 0; // 按鈕距離屏幕右側(cè)最大邊界
  double minWScreen = 60.w; // 按鈕距離屏幕最左側(cè)距離邊界
  final List<HomePageMakeBtn> makeBtnList = [
    HomePageMakeBtn('lib/assets/img/youtube.png', 'You Tube', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/apple.png', 'Apple', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/facebook.png', 'Facebook', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/douyin.png', 'Tik Tok', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/mi.png', 'MI', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/huawei.png', 'Hua Wei', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/youtube.png', 'TTT', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/apple.png', 'DDDD', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/facebook.png', 'FFFF', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/douyin.png', 'AAAA', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/mi.png', 'QQQQQ', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/huawei.png', 'WWWW', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/youtube.png', 'EEEEE', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/apple.png', 'RRRRR', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/facebook.png', 'YYYYYY', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/douyin.png', 'UUUUUU', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/mi.png', 'SSSSS', '', FocusNode()),
    HomePageMakeBtn('lib/assets/img/huawei.png', 'VVVV', '', FocusNode()),
  ];
  HomePageContentWidgetProvider(BuildContext context) {
    maxWScreen = MediaQuery.of(context).size.width - 246.w;
    // setMakeFocusAddListener();
    if (!init) {
      makeBtnList.first.focusNode.requestFocus();
      init = true;
    }
  }
  setMakeFocusAddListener() {
    for (int i = 0; i < makeBtnList.length; i++) {
      makeBtnList[i].focusNode.addListener(() {
        if (makeBtnList[i].focusNode.hasFocus) {
          // notifyListeners();
          print(
              '====${makeBtnList[i].name} : ${makeBtnList[i].focusNode.hasFocus}');
        }
      });
    }
  }
  setMakeFocusDispose() {
    for (var item in makeBtnList) {
      item.focusNode.removeListener(() {});
      item.focusNode.dispose();
    }
  }
  focusEventHandler(
      RawKeyEvent event, BuildContext context, HomePageMakeBtn param) async {
    /// 只處理按鍵按下的事件
    if (event.data is RawKeyEventDataAndroid &&
        event.runtimeType.toString() == 'RawKeyDownEvent') {
      CustomRawKeyEventDataAndroid _d =
          CustomRawKeyEventDataAndroid.format(event.data);
      /// 對(duì)按下確定鍵和中心鍵進(jìn)行處理
      if (_d.keyCode == 23 || _d.keyCode == 66) {
        Navigator.of(context).push(
            MaterialPageRoute(builder: (_) => MemoryPage(title: param.name)));
      } else {
        // for (var e in makeBtnList) {
        //   print('${e.name} : ${e.focusNode.hasFocus}');
        // }
        /// 對(duì)左鍵進(jìn)行處理
        if (_d.keyCode == 21) {
          await keyCodeDpadLeft(context, param);
        }
        /// 對(duì)右鍵進(jìn)行處理
        if (_d.keyCode == 22) {
          await keyCodeDpadRight(context, param);
        }
        notifyListeners();
      }
    }
  }
  /// 對(duì)左鍵進(jìn)行處理
  keyCodeDpadLeft(BuildContext context, HomePageMakeBtn param) async {
    /// 首位邊界處理
    final int _idx = makeBtnList.indexWhere((e) => e == param);
    if (_idx == 0) return;
    final int _nextIndex = _idx + 1;
    if ((_nextIndex % 7) == 1) {
      HomePageMakeBtn _nextNode = makeBtnList[_idx - 1];
      print(_nextNode.name);
      await Future.delayed(const Duration(milliseconds: 20));
      _nextNode.focusNode.requestFocus();
    }
  }
  /// 對(duì)右鍵進(jìn)行處理
  keyCodeDpadRight(BuildContext context, HomePageMakeBtn param) async {
    final int _idx = makeBtnList.indexWhere((e) => e == param);
    /// 末位邊界處理
    if (_idx == (makeBtnList.length - 1)) return;
    final int _nextIndex = _idx + 1;
    if ((_nextIndex % 7) == 0) {
      HomePageMakeBtn _nextNode = makeBtnList[_nextIndex];
      await Future.delayed(const Duration(milliseconds: 20));
      _nextNode.focusNode.requestFocus();
    }
  }
  @override
  void dispose() {
    setMakeFocusDispose();
    super.dispose();
  }
}
class HomePageMakeBtn {
  final String img;
  final String name;
  final String routerName;
  final FocusNode focusNode;
  HomePageMakeBtn(this.img, this.name, this.routerName, this.focusNode);
}
class CustomRawKeyEventDataAndroid {
  final int flags;
  final int codePoint;
  final int plainCodePoint;
  /// case 19: KEY_UP
  /// case 20: KEY_DOWN
  /// case 21: KEY_LEFT
  /// case 22: KEY_RIGHT
  /// case 23: KEY_CENTER
  final int keyCode;
  final int scanCode;
  final int metaState;
  CustomRawKeyEventDataAndroid(this.flags, this.codePoint, this.plainCodePoint,
      this.keyCode, this.scanCode, this.metaState);
  static CustomRawKeyEventDataAndroid format(d) {
    return CustomRawKeyEventDataAndroid(d.flags, d.codePoint, d.plainCodePoint,
        d.keyCode, d.scanCode, d.metaState);
  }
}

注意

我們可以看到在處理左鍵和右鍵的時(shí)候我們用了

這是為什么呢?

那是因?yàn)樵趯?shí)際效果中,我們r(jià)equestFocus操作的時(shí)候,F(xiàn)lutter的機(jī)制會(huì)首先觸發(fā)一次requestFocus,然后再觸發(fā)一次requestFocus,一共兩次,這就與我們的預(yù)想就有沖突了。

例如:

使用按鍵末尾向右時(shí),系統(tǒng)觸發(fā)的focus到UUUUU這個(gè)按鈕,我們的實(shí)際預(yù)想的是到Y(jié)YYYY即可。

使用按鍵首位向左時(shí),同樣會(huì)跨兩個(gè)focus。

目前Asscre并沒(méi)有找到很好的解決方案,但使用await Future delayed可以舒緩一下這不人性的操作。

對(duì)原有程序修改最小的InkWell和其他Android TV配置解決方案

首先,我們需要在AndroidManifest.xml 設(shè)置LEANBACK_LAUNCHER告訴平臺(tái)我們的程序是一個(gè)電視應(yīng)用程序

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LEANBACK_LAUNCHER"/> // 新增這一句
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

然后,我們?cè)贛ain入口文件中添加 Shortcuts用于我們的程序響應(yīng)我們的遙控器指令。

return Shortcuts(
  shortcuts: <LogicalKeySet, Intent>{
    LogicalKeySet(LogicalKeyboardKey.select): ActivateIntent(),
  },
  child: MaterialApp(
  ...
);

最后,使用InkWell來(lái)獲取焦點(diǎn)設(shè)置用戶遙控點(diǎn)擊的效果,其中focusColor幫助我們提醒用戶此時(shí)的按鈕位置。

    return Material(
      color: Colors.white.withAlpha(20),
      child: InkWell(
        focusColor: Colors.deepOrange.withAlpha(80),
        onTap: () => Navigator.of(context)
            .push(MaterialPageRoute(builder: (_) => MemoryPage(title: d.name))),
        child: SizedBox(
          height: 190,
          width: 190,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Image.asset(
                d.img,
                height: 80,
              ),
              SizedBox(height: 20),
              Text(
                d.name,
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 32,
                ),
              ),
            ],
          ),
        ),
      ),
    );

總結(jié)

上述兩種解決方案中,大家可以根據(jù)自己(boss)的喜好或者業(yè)務(wù)需求選擇一種使用。

在需要復(fù)雜的自定義的業(yè)務(wù)情況下,推薦使用RawKeyboardListener的解決方案,可以做出很多酷炫的效果,譬如按鍵事件觸發(fā)時(shí),focus住的widget可以做出放大、漸變等等效果,這有助于提升用戶的體驗(yàn)。

但,要是在現(xiàn)有的業(yè)務(wù)邏輯上,在少量調(diào)整后就可使用上述中的InkWell的解決方案。

文件參考

TV keyCode詳解

namekeycode說(shuō)明
KEYCODE_UNKNOWN0
----------------------------------------------------------
KEYCODE_SOFT_LEFT1
KEYCODE_SOFT_RIGHT2
KEYCODE_HOME3HOME鍵
KEYCODE_BACK4返回鍵
KEYCODE_CALL5撥號(hào)鍵
KEYCODE_ENDCALL6掛機(jī)鍵
KEYCODE_07
KEYCODE_18
KEYCODE_29
KEYCODE_310
KEYCODE_411
KEYCODE_512
KEYCODE_613
KEYCODE_714
KEYCODE_815
KEYCODE_916
KEYCODE_STAR17按鍵 *
KEYCODE_POUND18按鍵 #
KEYCODE_DPAD_UP19向上
KEYCODE_DPAD_DOWN20向下
KEYCODE_DPAD_LEFT21向左
KEYCODE_DPAD_RIGHT22向右
KEYCODE_DPAD_CENTER23確定鍵
KEYCODE_VOLUME_UP24音量增加鍵
KEYCODE_VOLUME_DOWN25音量減小鍵
KEYCODE_POWER26電源鍵
KEYCODE_CAMERA27拍照鍵
KEYCODE_CLEAR28
KEYCODE_A29
KEYCODE_B30
KEYCODE_C31
KEYCODE_D32
KEYCODE_E33
KEYCODE_F34
KEYCODE_G35
KEYCODE_H36
KEYCODE_I37
KEYCODE_J38
KEYCODE_K39
KEYCODE_L40
KEYCODE_M41
KEYCODE_N42
KEYCODE_O43
KEYCODE_P44
KEYCODE_Q45
KEYCODE_R46
KEYCODE_S47
KEYCODE_T48
KEYCODE_U49
KEYCODE_V50
KEYCODE_W51
KEYCODE_X52
KEYCODE_Y53
KEYCODE_Z54
KEYCODE_COMMA55按鍵 ,
KEYCODE_PERIOD56按鍵 .
KEYCODE_ALT_LEFT57
KEYCODE_ALT_RIGHT58
KEYCODE_SHIFT_LEFT59
KEYCODE_SHIFT_RIGHT60
KEYCODE_TAB61Tab鍵
KEYCODE_SPACE62空格鍵
KEYCODE_SYM63
KEYCODE_EXPLORER64
KEYCODE_ENVELOPE65
KEYCODE_ENTER66回車鍵
KEYCODE_DEL67退格鍵
KEYCODE_GRAVE68按鍵 `
KEYCODE_MINUS69按鍵-
KEYCODE_EQUALS70按鍵 =
KEYCODE_LEFT_BRACKET71按鍵 [
KEYCODE_RIGHT_BRACKET72按鍵 ]
KEYCODE_BACKSLASH73按鍵 \
KEYCODE_SEMICOLON74按鍵 ,
KEYCODE_APOSTROPHE75按鍵 ''單引號(hào)
KEYCODE_SLASH76按鍵 /
KEYCODE_AT77按鍵 @
KEYCODE_NUM78
KEYCODE_HEADSETHOOK79
KEYCODE_FOCUS80拍照對(duì)焦鍵
KEYCODE_PLUS81按鍵+
KEYCODE_MENU82菜單鍵
KEYCODE_NOTIFICATION83通知鍵
KEYCODE_SEARCH84
KEYCODE_MEDIA_PLAY_PAUSE85多媒體鍵 播放/暫停
KEYCODE_MEDIA_STOP86多媒體鍵 暫停
KEYCODE_MEDIA_NEXT87多媒體鍵 下一首
KEYCODE_MEDIA_PREVIOUS88多媒體鍵 上一首
KEYCODE_MEDIA_REWIND89多媒體鍵 快退
KEYCODE_MEDIA_FAST_FORWARD90多媒體鍵 快進(jìn)
KEYCODE_MUTE91話筒靜音鍵
KEYCODE_PAGE_UP92向上翻頁(yè)鍵
KEYCODE_PAGE_DOWN93向下翻頁(yè)鍵
KEYCODE_PICTSYMBOLS94
KEYCODE_SWITCH_CHARSET95
KEYCODE_BUTTON_A96
KEYCODE_BUTTON_B97
KEYCODE_BUTTON_C98
KEYCODE_BUTTON_X99
KEYCODE_BUTTON_Y100
KEYCODE_BUTTON_Z101
KEYCODE_BUTTON_L1102
KEYCODE_BUTTON_R1103
KEYCODE_BUTTON_L2104
KEYCODE_BUTTON_R2105
KEYCODE_BUTTON_THUMBL106
KEYCODE_BUTTON_THUMBR107
KEYCODE_BUTTON_START108
KEYCODE_BUTTON_SELECT109
KEYCODE_BUTTON_MODE110
KEYCODE_ESCAPE111ESC鍵
KEYCODE_FORWARD_DEL112刪除鍵
KEYCODE_CTRL_LEFT113
KEYCODE_CTRL_RIGHT114
KEYCODE_CAPS_LOCK115大寫鎖定鍵
KEYCODE_SCROLL_LOCK116
KEYCODE_META_LEFT117
KEYCODE_META_RIGHT118
KEYCODE_FUNCTION119
KEYCODE_SYSRQ120
KEYCODE_BREAK121Break/Pause鍵
KEYCODE_MOVE_HOME122光標(biāo)移動(dòng)到開(kāi)始鍵
KEYCODE_MOVE_END123光標(biāo)移動(dòng)到末尾鍵
KEYCODE_INSERT124
KEYCODE_FORWARD125
KEYCODE_MEDIA_PLAY126多媒體鍵 播放
KEYCODE_MEDIA_PAUSE127多媒體鍵 暫停
KEYCODE_MEDIA_CLOSE128多媒體鍵 關(guān)閉
KEYCODE_MEDIA_EJECT129多媒體鍵 彈出
KEYCODE_MEDIA_RECORD130多媒體鍵 錄音
KEYCODE_F1131
KEYCODE_F2132
KEYCODE_F3133
KEYCODE_F4134
KEYCODE_F5135
KEYCODE_F6136
KEYCODE_F7137
KEYCODE_F8138
KEYCODE_F9139
KEYCODE_F10140
KEYCODE_F11141
KEYCODE_F12142
KEYCODE_NUM_LOCK143小鍵盤鎖
KEYCODE_NUMPAD_0144
KEYCODE_NUMPAD_1145
KEYCODE_NUMPAD_2146
KEYCODE_NUMPAD_3147
KEYCODE_NUMPAD_4148
KEYCODE_NUMPAD_5149
KEYCODE_NUMPAD_6150
KEYCODE_NUMPAD_7151
KEYCODE_NUMPAD_8152
KEYCODE_NUMPAD_9153
KEYCODE_NUMPAD_DIVIDE154
KEYCODE_NUMPAD_MULTIPLY155
KEYCODE_NUMPAD_SUBTRACT156
KEYCODE_NUMPAD_ADD157
KEYCODE_NUMPAD_DOT158
KEYCODE_NUMPAD_COMMA159
KEYCODE_NUMPAD_ENTER160
KEYCODE_NUMPAD_EQUALS161
KEYCODE_NUMPAD_LEFT_PAREN162
KEYCODE_NUMPAD_RIGHT_PAREN163
KEYCODE_VOLUME_MUTE164揚(yáng)聲器靜音鍵
KEYCODE_INFO165
KEYCODE_CHANNEL_UP166
KEYCODE_CHANNEL_DOWN167
KEYCODE_ZOOM_IN168放大鍵
KEYCODE_ZOOM_OUT169縮小鍵
KEYCODE_TV170
KEYCODE_WINDOW171
KEYCODE_GUIDE172
KEYCODE_DVR173
KEYCODE_BOOKMARK174
KEYCODE_CAPTIONS175
KEYCODE_SETTINGS176
KEYCODE_TV_POWER177
KEYCODE_TV_INPUT178
KEYCODE_STB_POWER179
KEYCODE_STB_INPUT180
KEYCODE_AVR_POWER181
KEYCODE_AVR_INPUT182
KEYCODE_PROG_RED183
KEYCODE_PROG_GREEN184
KEYCODE_PROG_YELLOW185
KEYCODE_PROG_BLUE186
KEYCODE_APP_SWITCH187
KEYCODE_BUTTON_1188
KEYCODE_BUTTON_2189
KEYCODE_BUTTON_3190
KEYCODE_BUTTON_4191
KEYCODE_BUTTON_5192
KEYCODE_BUTTON_6193
KEYCODE_BUTTON_7194
KEYCODE_BUTTON_8195
KEYCODE_BUTTON_9196
KEYCODE_BUTTON_10197
KEYCODE_BUTTON_11198
KEYCODE_BUTTON_12199
KEYCODE_BUTTON_13200
KEYCODE_BUTTON_14201
KEYCODE_BUTTON_15202
KEYCODE_BUTTON_16203
KEYCODE_LANGUAGE_SWITCH204
KEYCODE_MANNER_MODE205
KEYCODE_3D_MODE206
KEYCODE_CONTACTS207
KEYCODE_CALENDAR208
KEYCODE_MUSIC209
KEYCODE_CALCULATOR210
KEYCODE_ZENKAKU_HANKAKU211
KEYCODE_EISU212
KEYCODE_MUHENKAN213
KEYCODE_HENKAN214
KEYCODE_KATAKANA_HIRAGANA215
KEYCODE_YEN216
KEYCODE_RO217
KEYCODE_KANA218
KEYCODE_ASSIST219
KEYCODE_BRIGHTNESS_DOWN220
KEYCODE_BRIGHTNESS_UP221
KEYCODE_MEDIA_AUDIO_TRACK222
KEYCODE_SLEEP223
KEYCODE_WAKEUP224
KEYCODE_PAIRING225
KEYCODE_MEDIA_TOP_MENU226
KEYCODE_11227
KEYCODE_12228
KEYCODE_LAST_CHANNEL229
KEYCODE_TV_DATA_SERVICE230
KEYCODE_VOICE_ASSIST231
KEYCODE_TV_RADIO_SERVICE232
KEYCODE_TV_TELETEXT233
KEYCODE_TV_NUMBER_ENTRY234
KEYCODE_TV_TERRESTRIAL_ANALOG235
KEYCODE_TV_TERRESTRIAL_DIGITAL236
KEYCODE_TV_SATELLITE237
KEYCODE_TV_SATELLITE_BS238
KEYCODE_TV_SATELLITE_CS239
KEYCODE_TV_SATELLITE_SERVICE240
KEYCODE_TV_NETWORK241
KEYCODE_TV_ANTENNA_CABLE242
KEYCODE_TV_INPUT_HDMI_1243
KEYCODE_TV_INPUT_HDMI_2244
KEYCODE_TV_INPUT_HDMI_3245
KEYCODE_TV_INPUT_HDMI_4246
KEYCODE_TV_INPUT_COMPOSITE_1247
KEYCODE_TV_INPUT_COMPOSITE_2248
KEYCODE_TV_INPUT_COMPONENT_1249
KEYCODE_TV_INPUT_COMPONENT_2250
KEYCODE_TV_INPUT_VGA_1251
KEYCODE_TV_AUDIO_DESCRIPTION252
KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP253
KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN254
KEYCODE_TV_ZOOM_MODE255
KEYCODE_TV_CONTENTS_MENU256
KEYCODE_TV_MEDIA_CONTEXT_MENU257
KEYCODE_TV_TIMER_PROGRAMMING258
KEYCODE_HELP259
KEYCODE_NAVIGATE_PREVIOUS260
KEYCODE_NAVIGATE_NEXT261
KEYCODE_NAVIGATE_IN262
KEYCODE_NAVIGATE_OUT263
KEYCODE_STEM_PRIMARY264
KEYCODE_STEM_1265
KEYCODE_STEM_2266
KEYCODE_STEM_3267
KEYCODE_DPAD_UP_LEFT268
KEYCODE_DPAD_DOWN_LEFT269
KEYCODE_DPAD_UP_RIGHT270
KEYCODE_DPAD_DOWN_RIGHT271
KEYCODE_MEDIA_SKIP_FORWARD272
KEYCODE_MEDIA_SKIP_BACKWARD273
KEYCODE_MEDIA_STEP_FORWARD274
KEYCODE_MEDIA_STEP_BACKWARD275
KEYCODE_SOFT_SLEEP276
KEYCODE_CUT277
KEYCODE_COPY278
KEYCODE_PASTE279
KEYCODE_SYSTEM_NAVIGATION_UP280
KEYCODE_SYSTEM_NAVIGATION_DOWN281
KEYCODE_SYSTEM_NAVIGATION_LEFT282
KEYCODE_SYSTEM_NAVIGATION_RIGHT283

以上就是Flutter TV Android端開(kāi)發(fā)技巧詳細(xì)教程的詳細(xì)內(nèi)容,更多關(guān)于Flutter TV Android端開(kāi)發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論