用于为React Native创建Android本机模块的Boilerplate

时间:2016-10-25 03:29:16

标签: android react-native react-native-android

是否有可接受的样板用于创建在React Native应用程序中使用的本机Android模块。我在创建原生Android模块时遇到的一些问题:

  1. 本机模块没有建议的样板。所以,我只是复制一些本机模块项目并删除所有项目特定的代码,并保留其余主要包括一些gradle和属性文件,但我总是担心它是否包含一些必需的文件或它包含一些项目特定的设置会干扰我的模块等。
  2. 该项目从未在Android工作室中成功构建,因为它无法找到任何需要导入以创建本机模块的facebook软件包。所以,我最终在模块中编写代码。在我的主应用程序中导入模块。在Android Studio中为主应用程序构建android项目并修复任何编译错误。这是创建本机模块的常用方法,还是至少可以在Android Studio中成功构建本机模块
  3. 这有点不相关但是有一个build.gradle文件用于所有本机模块,一个用于我的class JobsForCategoryVC: UIViewController { //MARK:-Outlets @IBOutlet weak var jobTableView: UITableView! @IBOutlet weak var activityIndicator: UIActivityIndicatorView! //MARK:-Properties var refreshControl:UIRefreshControl! var jobCategory:JobCategoryDB! var pageNumber:Int = 1 var downloadMore:Bool = true var jobs = [JobModel]() //MARK:-LifeCycle override func viewDidLoad() { super.viewDidLoad() setupView() freshDownload() } func setupView(){ refreshControl = UIRefreshControl() refreshControl.attributedTitle = NSAttributedString(string: "Loading fresh Jobs") refreshControl.addTarget(self, action: #selector(self.freshDownload), for: .valueChanged) jobTableView.addSubview(refreshControl) } func freshDownload(){ pageNumber = 1 downloadMore = true downloadJobsFrom(top: true) } func downloadJobsFrom(top:Bool){ if !refreshControl.isRefreshing && top{ activityIndicator.startAnimating() } let url = URLStringList.getSearchCategoryJobString(pageNumber: pageNumber, categoryId: jobCategory.id!) if let url = URL(string: url){ Alamofire.request(url, method: .get).responseJSON { (response) in if response.result.isSuccess{ let json = response.result.value let model = Mapper<JobModel>().mapArray(JSONArray: json as! [[String : Any]]) if model?.count == 0{ self.downloadMore = false } if let jobs = model{ if top{ self.jobs = jobs }else{ self.jobs += jobs } self.jobTableView.reloadData() self.pageNumber += 1 } self.refreshControl.endRefreshing() self.activityIndicator.stopAnimating() }else{ self.activityIndicator.stopAnimating() DispatchQueue.main.async(execute: { self.refreshControl.endRefreshing() self.jobTableView.reloadData() }) if top{ showInternetConnectionAlert(viewController: self, activityIndicator: self.activityIndicator, completion: nil) } } } } } } extension JobsForCategoryVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if jobs.count > 0 { jobTableView.backgroundView = nil let cellCount = jobs.count + ((jobs.count-1)/(AdForNumberOfCells-1)) + 1 return cellCount } jobTableView.backgroundView = Bundle.main.loadNibNamed("PullToRefreshView", owner: nil, options: nil)?.first as? PullToRefreshView return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.row % AdForNumberOfCells == 0{ if let cell = tableView.dequeueReusableCell(withIdentifier: "JobsAdTableViewCell", for: indexPath) as? JobsAdTableViewCell{ cell.controller = self return cell } }else{ if let cell = tableView.dequeueReusableCell(withIdentifier: "JobsTableViewCell", for: indexPath) as? JobsTableViewCell{ let index = NSIndexPath(item: indexPath.row-(indexPath.row/AdForNumberOfCells)-1, section: 0) cell.configure(job: jobs[index.row]) return cell } } return UITableViewCell() } } extension JobsForCategoryVC:UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let webView = storyboard?.instantiateViewController(withIdentifier: "WKWebVC") as? WKWebVC{ if indexPath.row % AdForNumberOfCells == 0 { return } let index = NSIndexPath(item: indexPath.row-(indexPath.row/AdForNumberOfCells)-1, section: 0) if let urlString = jobs[index.row].url{ webView.url = urlString webView.titleString = jobs[index.row].title present(webView, animated: true, completion: nil) } } } func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == self.jobs.count - 1 && downloadMore{ downloadJobsFrom(top: false) } } } 模块,它们具有类似的设置。 app build.gradle文件是否会覆盖其他本机模块build.gradle文件,并用于构建所有本机模块或根据其自己的build.gradle文件构建的每个本机模块
  4. 请分享您对以上任何/所有内容的想法/见解。谢谢!

1 个答案:

答案 0 :(得分:0)

我是反应原生的新手,我最初遇到了不知道如何生成Android / iOS原生模块的问题。

我在其他示例代码中看到了它们,并且最初尝试复制它们并清理它们,但我知道/觉得我做错了。

然后我回过头来注意到这个文档(https://facebook.github.io/react-native/docs/getting-started.html)中有一个“快速启动”选项卡和[你想要的]一个“用本机代码构建项目”选项卡。

“使用本机代码构建项目”选项卡会向您显示react-native init AwesomeProject,这是生成样板Android和iOS本机模块的秘诀。

对此我不熟悉,我仍然在寻找一个选项来生成Android / iOS样板,并且没有 BUCK支持。