商店後台步驟
-
設定/應用程式完整性/Play 應用程式簽署
-
選擇
從 Android Studio 匯出並上傳金鑰 -
上傳私密金鑰- 📎 private_key.pepk
| /** | |
| * ThemeableBrowser executeScript 測試程式碼 | |
| * 測試在 Android 平台上執行多段有回傳值的 JS 程式碼並接收陣列回傳 | |
| */ | |
| // 等待 deviceready 事件 | |
| document.addEventListener('deviceready', function() { | |
| console.log('Device ready, starting executeScript tests...'); | |
| // 開啟 ThemeableBrowser |
| // File: KeyValueStore.swift | |
| protocol KeyValueStore { | |
| func set(key: String, value: String, completion: @escaping (Result<Void, Error>) -> Void) | |
| func get(key: String, completion: @escaping (Result<String?, Error>) -> Void) | |
| func remove(key: String, completion: @escaping (Result<String?, Error>) -> Void) | |
| func removeAll(completion: @escaping (Result<Void, Error>) -> Void) | |
| } | |
| // File: ReadableKeyValueStore.swift | |
| protocol ReadableKeyValueStore { |
| ScrollView( | |
| child: Padding( | |
| padding: const EdgeInsets.all(46.0), // 添加 46px 的邊距 | |
| child: Container( | |
| child: Column( | |
| mainAxisAlignment: MainAxisAlignment.center, | |
| children: <Widget>[ | |
| Text('這是第一行文字'), | |
| Text('這是第二行文字'), | |
| // 你可以在此處添加更多的 Widget |
| /// A generic class that holds a value or an exception. | |
| class RequestResult<T> { | |
| const RequestResult._(); | |
| const factory RequestResult.success(T? data) = Success<T>; | |
| const factory RequestResult.error(Exception exception) = Error<T>; | |
| const factory RequestResult.nothing() = Nothing<T>; | |
| } |
| import 'package:flutter/material.dart'; | |
| const Color darkBlue = Color.fromARGB(255, 18, 32, 47); | |
| void main() { | |
| runApp(MyApp()); | |
| } | |
| class MyApp extends StatelessWidget { | |
| @override |
| import 'package:flutter/material.dart'; | |
| import 'routes_config.dart'; | |
| import '../presentation/screens.dart'; | |
| import '../constants.dart'; | |
| class ShopListRouterDelegate extends RouterDelegate<ShopListRouteConfig> | |
| with ChangeNotifier, PopNavigatorRouterDelegateMixin<ShopListRouteConfig> { | |
| @override | |
| final GlobalKey<NavigatorState> navigatorKey; |
| import kotlinx.coroutines.experimental.CommonPool | |
| import kotlinx.coroutines.experimental.channels.Channel | |
| import kotlinx.coroutines.experimental.launch | |
| import okhttp3.* | |
| import okio.ByteString | |
| import kotlin.coroutines.experimental.suspendCoroutine | |
| /** | |
| * Created by omarmiatello on 17/06/17. | |
| */ |
| /* | |
| * Copyright (c) 2017 Emil Davtyan | |
| * | |
| * Permission is hereby granted, free of charge, to any person obtaining | |
| * a copy of this software and associated documentation files (the | |
| * "Software"), to deal in the Software without restriction, including | |
| * without limitation the rights to use, copy, modify, merge, publish, | |
| * distribute, sublicense, and/or sell copies of the Software, and to | |
| * permit persons to whom the Software is furnished to do so, subject to | |
| * the following conditions: |
商店後台步驟
設定/應用程式完整性/Play 應用程式簽署
選擇 從 Android Studio 匯出並上傳金鑰
上傳私密金鑰
| import 'package:dio/dio.dart'; | |
| import 'package:flutter_bili_app/http/core/hi_adapter.dart'; | |
| import 'package:flutter_bili_app/http/core/hi_error.dart'; | |
| import 'package:flutter_bili_app/http/request/base_request.dart'; | |
| /// Dio 適配器 | |
| class DioAdapter extends HiNetAdapter { | |
| @override | |
| Future<HiNetResponse<T>> send<T>(BaseRequest request) async { | |
| var response, options = Options(headers: request.header); |