Web_Advance
  • 本書簡介
  • Node.js 部分
    • Node 版本管理
    • 使用NPM
      • Yarn
    • 開始Node
    • Worker Thread
    • REPL
    • TCP
    • path
    • Cluster and Child_process
    • assert (自訂拋出的錯誤)
    • Stream(流)
    • util (工具類)
    • EventEmitter
    • fs 文件操作
    • Buffer
      • Binary Diff
      • 查看 Binary 檔案內容
    • Process (進程)
    • 錯誤處理
  • OS
  • Async Hook
  • TCP
  • HTTP
    • 有關爬蟲
    • HTTP/2
    • HTTP Protocal
  • HTTPS
    • HTTPS 流程
    • SSL pinning
    • HTTPS 封包解密
    • 建立自簽發 HTTPS 證書
    • 幫網站加上HTTPS
    • HTTPS原理
  • Crypto加密
  • 有關繼承
  • JS 基本
    • JavaScript 迴圈與異步處理
  • 使用 Express
    • 上傳檔案
    • 圖片伺服器
    • 簡單範例
  • 使用 Nest.js
  • 使用MongoDB
    • 設置帳戶登入權限
    • Mongoose 框架
    • 進階Mongo
    • 基本環境操作
    • MongoDB Sharding
  • 使用MySQL
    • Schema 架構設計
    • SQL 語法
    • SQL Procedure
    • Node.js 操作 MySQL
    • 使用 Sequelize
      • DB Migration
      • function
  • 使用PostgreSQL
    • 常見問題
    • replica
    • 基本指令
    • 使用Node.js操控pg
    • SQL 基礎
  • 使用TypeORM
  • RethinkDB
  • CSS 深度探討
    • Width, Height
  • React
    • 第三方組件
      • Formik
    • styled component
    • propTypes
    • React webpack 部署
    • React util
    • 寫component並且publish
    • create-react-app
    • Context API
    • i18n
    • Server side render
    • Next.js教學
    • Higher order component 與 Recompose
    • component 間 互相存取
    • React hook
  • React router
    • 自己寫一個Router
  • Redux
    • Redux Toolkit
    • 小技巧
    • Redux sagas
    • compose
  • React Native
    • adb
    • InApp Billing
    • Icon
    • SVG
    • Firebase
      • Phone Auth
    • 自動化測試
    • Splash screen
    • Websocket
    • Googla OAuth
      • iOS
      • Android
    • Facebook OAuth
      • iOS
      • Android
    • IOS
    • 第三方組件
      • Auth Code Input
      • Country Code Picker
      • onboarding screen
      • Toast
    • ESlint
    • Push notification
    • Android 上架步驟
    • Expo
    • router
      • react-navigation套件
    • 原生組件
      • RefreshControl
      • Modal
      • Alert
      • button
      • KeyboardAvoidingView
      • Drawer
      • Image
    • 限制螢幕垂直與水平
    • NativeBase UI
    • Debug
    • 常見問題
    • Network
    • 硬體操作
      • 隱藏鍵盤
      • 地理位置
      • 相機與圖片庫存取
    • Async Storage
    • Animation
    • Admob
  • JS 模組化
  • 使用 Webpack
  • 使用 Babel
  • JWT Token
  • ES6 ES7 ES8
    • Array method
    • ES8 Async
    • ES6 Proxy
    • ES6 Object
    • ES6 Arrow function
    • ES6 Promise
    • ES6 Symbol
    • ES6 Generator
    • ES6 Set,Map
    • ES6 Class
  • 模板引擎
    • Mustache
    • Handlebars.js
    • EJS
  • ESLint
  • 部屬到OpenShift
  • OpenStack
  • OAuth
    • Twitter OAuth
    • Google authenticator
    • facebook oauth
      • facebook like ,share
    • google oauth
  • Redis
  • 做一個簡單的markdown editor
  • Websocket
    • WebSocket 相關 Protocol
  • Sublime 安裝套件
  • Google api
    • Cloud Run
    • speech api
    • place autocomplete
    • Geocode
    • Map
      • React map
    • vision api
    • Google-recaptcha
    • Google sheet
  • Instagram API
  • Markdown 與 code pretty js
  • HTML5
    • IntersectionObserver
    • HTML5 audio
    • HTML5 Video 與 WebRTC
      • WebRTC 進階
      • WebEX API
    • HTML5 IndexedDB
  • Google Cloud Platform (GCP)
    • Cloud Storage
    • Cloud storage 串接 Cloud CDN
  • Vim 編輯器
  • 使用nginx
    • config
  • Unix 實用指令
    • 新 VPS 安裝流程
    • Ubuntu 22 安裝
    • Shell Script 教學
  • Git 實用指令
    • Git hook
    • 加上 SSH-key 到 GitHub
    • GPG簽名
  • SSH 實用指令
  • 有關Fetch與axios與跨域請求
  • 圖片上傳相關
    • imgur API
  • JS 格式轉換
  • js trick
  • AWS
    • AWS EBS
    • AWS HTTPS 憑證
    • AWS Cloudfront、ELB、ACL
    • AWS Athena
    • AWS CloudWatch、SNS
    • AWS RDS
    • AWS lambda
      • 範例
      • 加上權限控管
    • AWS S3
    • AWS DynamoDB
      • 結合Lambda
    • 快速把 EC2 串上 AWS Cloudfront CDN
    • AWS 證照相關
  • 有關日期Date
  • VS code 編輯器
    • VSCode 外掛 Plugin
  • CI with Gitlab&Jenkins
  • API 測試
    • Postman
      • 設置 Postman 環境變數
    • API Blueprint
    • swagger
      • 註解寫在Code內生成swagger UI
  • Javascript 實用Lib
  • 遠端寫程式
  • Quicktime錄影注意事項
  • Web開發進階Bug
  • Web壓力測試
  • LineBot
  • PM2部署
  • i18n
  • VPN
  • Protocol Buffers
  • Docker教學
    • LXC LXD
    • Docker Compose
    • Docker 原理
    • Docker 指令
  • E2E Testing
    • Cypress
    • PlayWright
    • Puppeteer 與其他 UI 測試工具
  • Unit Test (Jest & enzyme)
    • React Testing Library
    • mocha
  • Cassandra
    • cluster
  • Distribute Web
    • Dat project
    • IPFS project
  • Cluster and Child_process
  • 打包應用程式
  • Java
    • 使用gradle結合docker
  • Debug 頁面
  • Proxy
  • Chrome extension
  • 消息系統
    • RabbitMQ
  • 金流串接
    • Paypal
    • spgateway智富通
    • Stripe 串接
  • 有關Log
  • 設定 feature flag
  • Azure
    • Face API
    • Image Analyze API
    • Azure Serverless
    • Cosmos DB
      • 使用 SDK
      • 以 RESTful 操作 DB
      • 一致性策略與 DB replicate
  • NodeBB 筆記
  • 瀏覽器快取與緩存(Etag, If-None-Match)
  • 瀏覽器快取與緩存(Expires, Last-modified, Cache-Control)
  • Node.js 第三方模組
    • OpenCV
  • Kubernetes
    • 本地測試 MiniKube
  • Ngrok 使用
  • Telegram MiniAPP 開發
  • Firebase 教學
  • 演算法筆記
  • 圖表
    • Echart
    • TradingView 圖表
    • D3
    • 熱力圖 heatmap
  • 後端緩存 Cache
  • 資料一致性
  • Web 安全機制
    • Cookie 與 LocalStorage
  • Vue
    • Element UI
    • Devtool
    • Vuex
    • Vue router
  • 相關網路協議
    • 網路 IP 基礎
    • Google Search 技巧
    • 網路診斷工具
    • IP
    • DNS
  • GitLab 與 Drone
  • SMTP、POP、IMAP
    • SendGrid
  • IPC
  • 串流服務
    • Twilio
    • Agora
  • 其他資源
  • GraphQL
  • Typescript
  • UI 相關資源
  • FFmpeg
  • Unity 遊戲開發筆記
  • Influx DB
  • Windows 相關
  • DALL·E 3
  • Coap
  • Slack API
  • 資訊安全
    • 破解 ZIP 密碼
Powered by GitBook
On this page
  • React Native
  • 2.React native專案檔案介紹
  • 3.Implement with Redux
  • 4.Layout
  • 內建基本元件
  • 產生APK
  • 開發
  • 連接手機

Was this helpful?

Edit on GitHub

React Native

React Native

npm建議版本 4.6.1 or 5.3.0 (其他容易會有安裝package失敗問題)

1.windows環境建置

需求安裝:

1.JDK

2.Android Studio

3.Genymotion

4.Node.js

1.npm install -g react-native-cli 安裝

2.react-native init AwesomeProject react native創建資料夾

3.安裝JDK與android studio後,創建一個新專案

4.進到專案資料夾把local.properties 複製到AwesomeProject 的android資料夾內 產生環境變數

5.開啟android studio 點選上方圖案(SDK manger),之後再點Launch Standalone SDK manger 勾選build tool後安裝

記得把android SDK 加入系統環境變數(ANDROID_HOME)

6.在cmd輸入react-native run-android(記得開好genymotion),正常跑完會出現紅色底字,這時因為我們還沒啟動react-native的server

7.於cmd輸入 react-native start ,之後於genymotino點選Reload JS即可

(如果使用Android studio的原生模擬器,在windows上要按ctrl+m)

8.正常啟動後,可點選index.android.js修改,之後點genymotion的右側menu,設定hot reload 儲存後即立刻更改畫面

未來啟動順序必須為

1. cd 專案資料夾根目錄

2.react-native run-android(安裝APP到debug 用設備)

3.react-native start
(啟動H
OT RELOAD SERVER)

可能的問題

1.watchman timeout
2.fbjs
3.Connect device failed

解決方案

1.確保node.js的版本
確定watchmanconfig檔案存在(於一開始build時)
2.npm install in admin
如果沒有hot reload儲存沒反應,可先從emulator按上一頁,之後點選app重新進入,即可
如果hot reload跳出app或是無法reload JS,需重新compile app
3.參考此篇 設定genymotion android SDK path

http://stackoverflow.com/questions/34692210/react-native-errortimeout-getting-device-list-when-running-hello-world-on-ubunt

4.如果模擬器有開但在run-android時卻說找不到模擬器,可以先跑react-native start之後會出現問題在哪

2.React native專案檔案介紹

1.index.android.js

我們一般會在該檔案,寫為如下

'use strict';

import React, { AppRegistry } from 'react-native';
import App from './app/containers/app.js';

AppRegistry.registerComponent('AwesomeProject', () => App);

特別要注意的地方為

AppRegistry.registerComponent('AwesomeProject', () => App);

registerComponent第一個參數要跟資料夾名稱相同,第二個參數要跟你的component enrty相同

2.app目錄

我們假設你已經學過React跟redux的基礎,以下我們稱react-native簡稱為native

在native中,和一般node專案一樣使用npm安裝套件,接著再跟目錄創建app資料夾,將專案相關文件都寫於裡面

3.buckconfig(給IOS用)

4.flowconfig

3.Implement with Redux

下載後

1.將app資料夾放入你的project

2.npm install redux react-redux redux-thunk --save

3..將index.android.js改為如下即可運行

'use strict';

import React, { AppRegistry } from 'react-native';
import App from './app/containers/app.js';

AppRegistry.registerComponent('AwesomeProject', () => App);

目前專案結構長為這樣

4.Layout

1.flex介紹

1.父元素要有flex屬性,子元素flex才有作用

2.flex數字越高,占的空間越大 (主要為同一層元素之flex數字間的比例關係)

1.基本範例

import React, {
  AppRegistry,
  Component,
  StyleSheet,
  Text,
  View
} from 'react-native';

class nativereact extends Component {
  render() {
    return (
      <View style={{flex:1}}>
              <View style={styles.style_0}>

               </View>
                <View style={styles.style_1}>

                </View>
                <View style={{flex:100}}>

                </View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  style_0:{
            flex:20,
            height:40,
            borderWidth: 1,  
            borderColor: 'blue',
        },
   style_1:{
            flex:30,
            height:40,
            borderWidth: 1,  
            borderColor: 'green',
        }
});

AppRegistry.registerComponent('nativereact', () => nativereact);

2.改變layout 方向(flexDirection)

於父元素加入該屬性,其子元素會改變layout排列方向

class nativereact extends Component {
  render() {
    return (
      <View style={{flex:1,flexDirection: 'row'}}>
              <View style={styles.style_0}>

               </View>
                <View style={styles.style_1}>

                </View>
                <View style={{flex:100}}>

                </View>
      </View>
    );
  }
}

3.其他layout方法與CSS 的flexbox屬性用法相同

在container中的style
justifyContent:'center',
alignItems: 'center'

分別負責垂直及水平置中

內建基本元件

須先於上方import進入js檔案

1.View

用作container使用,包在其他元件外

2.Text

產生文字

3.Image

source 屬性 可指定來源

style中的`resizeMode:Image.resizeMode.contain`可讓圖片解析固定

4.Touchable事件

1.TouchableOpacity

點擊時改變透明度

2.TouchableHighlight

點擊時改變透明度、顏色,及其他(為TouchableOpacity的加強版)

PS:記得要有onPress屬性,才會有效果

 onPress={() => console.log('custom THW text - highlight')}

5.DrawerLayoutAndroid

類似於隱藏選單,從邊緣拉入後顯示

render() {

     var navigationView = (
    <View style={{flex: 1, backgroundColor: '#fff'}}>
      <Text style={{margin: 10, fontSize: 15, textAlign: 'left'}}>I'm in the Drawer!</Text>
    </View>
  );

return (  <DrawerLayoutAndroid
      drawerWidth={300}
      drawerPosition={DrawerLayoutAndroid.positions.Left}
      renderNavigationView={() => navigationView}>

        <View>

        </View>
  </DrawerLayoutAndroid>
    );
  }
}

於最外層view外面加入DrawerLayoutAndroid Tag,且從renderNavigationView屬性寫出Drawer的外觀

6.ListView

許多列組成的畫面

     <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderMovie}
        style={styles.listView}
      />

      datasource為資料來源
      renderRow為每列用資料產生的畫面

EX:

var REQUEST_URL = 'https://raw.githubusercontent.com/facebook/react-native/master/docs/MoviesExample.json';

class nativereact extends Component {
 constructor(props) {
    super(props);
    this.state = {
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2,
      }),
      loaded: false,
    };
  }
  componentDidMount() {
    this.fetchData();
  }
   fetchData() {
    fetch(REQUEST_URL)
      .then((response) => response.json())
      .then((responseData) => {
        this.setState({
          dataSource: this.state.dataSource.cloneWithRows(responseData.movies),
          loaded: true,
        });
      })
      .done();
  }

/////////  
  render() {
    console.log(this.state)
    if (!this.state.loaded) {
      return this.renderLoadingView();
    }
  return (
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderMovie}
        style={styles.listView}
      />
    );
  }

  renderLoadingView() {
    return (
      <View style={styles.container}>
        <Text>
          正在加载電影數據……
        </Text>
      </View>
    );
  }

  renderMovie(movie) {
    return (
      <View style={styles.container}>
        <Image
          source={{uri: movie.posters.thumbnail}}
          style={styles.thumbnail}
        />
        <View style={styles.rightContainer}>
          <Text style={styles.title}>{movie.title}</Text>
          <Text style={styles.year}>{movie.year}</Text>
        </View>
      </View>
    );
  }
}

產生APK

1.使用JAVA工具產生keystore

使用admin開啟cmd後cd到C:\Program Files\Java\jre7\bin

再來輸入

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

之後依序填入資訊,記得:其中分別有兩次的密碼要你輸入,必須輸入不同的,最後會在bin資料夾下看到產生的keystore

2.之後把剛才產生的keystore檔案放在react專案下的android\app路徑資料夾內

3.修改android資料夾下的gradle.properties檔案

將星號改為你剛才輸入的store與key的密碼

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****

4.在android/app/build.gradle 檔案中新增

1.先加入整個signingConfig如下

signingConfigs {
        release {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }

2.之後在buildTypes的release系新增一條規則如下

    buildTypes的release系新增一挑規則 {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }

加完後類似如下

...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...

5.最後

先cd android

之後輸入gradlew assembleRelease

即可

官網雖有更新,不過這個 build 流程 2020/10 確認還可用

有關於 assembleRelease 與 bundleRelease 差別可參考以下:

6.確認與安裝

在C:\Users\yicheng\reactNative2\android\app\build\outputs\apk

即可發現產生了app-release.apk 檔案

(如產生的檔案為unsign,須確認上述的config內容是否正確)

之後可直接把該apk放入手機安裝及可

或是輸入gradlew installRelease會直接安裝在模擬器(記得先把之前dev時安裝在上面的app刪除,否則無法安裝)

開發

  1. 先開啟Genymotion

  2. 輸入以下:

react-native run-android

連接手機

如果沒有 adb 可以去下載 android sdk

/Users/easonwang/Library/Android/sdk/platform-tools/adb

然後連接手機後選取傳輸檔案,然後開放 USB 偵錯

選擇手機是的 system > 多點幾下 build version 欄位 > 打開user debugging

之後輸入 react-native run-android 即可

可輸入 adb devices 確認只有一個裝置

PreviouscomposeNextadb

Last updated 3 years ago

Was this helpful?

Flow is not supported on Windows, so this integration is not yet available on that platform.

範例連結:

http://nuclide.io/docs/platforms/react-native/#buck-integration
http://flowtype.org/
https://github.com/alinz/example-react-native-redux
https://blog.swmansion.com/make-your-react-native-app-3x-smaller-44c993eda2c9