Hello substrate sandbox: Successfully connected to local duniter v2s node; Best bloc realtime subscription

This commit is contained in:
poka 2022-02-18 00:20:21 +01:00
parent acf0e8f29b
commit 3513b0440d
8 changed files with 255 additions and 8 deletions

View File

@ -45,8 +45,8 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "gecko.axiomteam.fr"
minSdkVersion 16
targetSdkVersion 30
minSdkVersion 19
targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true

View File

@ -9,9 +9,12 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true"
<application
android:requestLegacyExternalStorage="true"
android:name="${applicationName}"
android:label="Ğecko">
android:label="Ğecko"
android:usesCleartextTraffic="true">
<!-- TODO: Remove usesCleartextTraffic for production mode ! kopa -->
<!-- android:icon="@mipmap/ic_launcher"> -->
<activity
android:requestLegacyExternalStorage="true"

View File

@ -25,6 +25,7 @@ import 'package:gecko/models/chest_data.dart';
import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/providers/generate_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart';
@ -154,7 +155,8 @@ class Gecko extends StatelessWidget {
ChangeNotifierProvider(create: (_) => WalletOptionsProvider()),
ChangeNotifierProvider(create: (_) => ChangePinProvider()),
ChangeNotifierProvider(create: (_) => SearchProvider()),
ChangeNotifierProvider(create: (_) => CesiumPlusProvider())
ChangeNotifierProvider(create: (_) => CesiumPlusProvider()),
ChangeNotifierProvider(create: (_) => SubstrateSdk())
],
child: GraphQLProvider(
client: _client,
@ -178,8 +180,8 @@ class Gecko extends StatelessWidget {
),
primaryColor: const Color(0xffFFD58D),
textTheme: const TextTheme(
bodyText1: TextStyle(),
bodyText2: TextStyle(),
bodyText1: TextStyle(fontSize: 20),
bodyText2: TextStyle(fontSize: 18),
).apply(
bodyColor: const Color(0xFF000000),
),

View File

@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
import 'package:polkawallet_sdk/api/types/networkParams.dart';
import 'package:polkawallet_sdk/polkawallet_sdk.dart';
import 'package:polkawallet_sdk/storage/keyring.dart';
class SubstrateSdk with ChangeNotifier {
final String subNode = '192.168.1.85:9944';
final bool isSsl = false;
final WalletSDK sdk = WalletSDK();
final Keyring keyring = Keyring();
bool sdkReady = false;
bool nodeConnected = false;
int blocNumber = 0;
Future<void> initApi() async {
await keyring.init([0, 2]);
await sdk.init(keyring);
sdkReady = true;
notifyListeners();
}
Future<void> connectNode() async {
final String socketKind = isSsl ? 'wss' : 'ws';
final node = NetworkParams();
node.name = 'pokaniter';
node.endpoint = '$socketKind://$subNode';
node.ss58 = 42;
final res = await sdk.api.connectNode(keyring, [node]).timeout(
const Duration(seconds: 10),
onTimeout: () => null,
);
if (res != null) {
nodeConnected = true;
notifyListeners();
}
// Subscribe bloc number
sdk.api.setting.subscribeBestNumber((res) {
blocNumber = int.parse(res.toString());
notifyListeners();
});
}
}

View File

@ -12,6 +12,7 @@ import 'package:gecko/screens/onBoarding/1.dart';
import 'package:gecko/screens/search.dart';
import 'package:gecko/screens/settings.dart';
import 'package:flutter/services.dart';
import 'package:gecko/screens/substrate_sandbox.dart';
import 'package:provider/provider.dart';
class HomeScreen extends StatelessWidget {
@ -176,9 +177,28 @@ Widget geckHome(context) {
),
],
),
)
),
]),
),
const SizedBox(height: 15),
Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
ElevatedButton(
style: ElevatedButton.styleFrom(
primary: yellowC, // background
onPrimary: Colors.black, // foreground
),
onPressed: () => Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const SubstrateSandBox();
}),
),
child: const Text(
'SUBSTRATE SANDBOX',
style: TextStyle(fontSize: 20),
),
),
]),
Expanded(
flex: 1,
child: Container(

View File

@ -0,0 +1,64 @@
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
class SubstrateSandBox extends StatelessWidget {
const SubstrateSandBox({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
return StatefulWrapper(
onInit: () async {
await _sub.initApi();
await _sub.connectNode();
},
child: Scaffold(
appBar: AppBar(
toolbarHeight: 60 * ratio,
title: const SizedBox(
height: 22,
child: Text('Substrate Sandbox'),
),
),
body: SafeArea(
child: Consumer<SubstrateSdk>(builder: (context, _sub, _) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('js-api chargé ?: ${_sub.sdkReady}'),
Text(
'Noeud connecté ?: ${_sub.nodeConnected} (${_sub.subNode})'),
if (_sub.nodeConnected)
Text('Numéro de bloc: ${_sub.blocNumber}'),
]);
}),
),
),
);
}
}
class StatefulWrapper extends StatefulWidget {
final Function onInit;
final Widget child;
const StatefulWrapper({Key? key, required this.onInit, required this.child})
: super(key: key);
@override
_StatefulWrapperState createState() => _StatefulWrapperState();
}
class _StatefulWrapperState extends State<StatefulWrapper> {
@override
void initState() {
widget.onInit();
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}

View File

@ -8,6 +8,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "30.0.0"
aes_ecb_pkcs5_flutter:
dependency: transitive
description:
name: aes_ecb_pkcs5_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
analyzer:
dependency: transitive
description:
@ -43,6 +50,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.2"
auth_header:
dependency: transitive
description:
name: auth_header
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
barcode:
dependency: transitive
description:
@ -347,6 +361,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_inappwebview:
dependency: transitive
description:
name: flutter_inappwebview
url: "https://pub.dartlang.org"
source: hosted
version: "5.3.2"
flutter_launcher_icons:
dependency: "direct main"
description:
@ -404,6 +425,20 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
get:
dependency: transitive
description:
name: get
url: "https://pub.dartlang.org"
source: hosted
version: "4.6.1"
get_storage:
dependency: transitive
description:
name: get_storage
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
glob:
dependency: transitive
description:
@ -530,6 +565,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
http_server:
dependency: transitive
description:
name: http_server
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
image:
dependency: transitive
description:
@ -591,6 +633,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
jaguar:
dependency: transitive
description:
name: jaguar
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.12"
jaguar_common:
dependency: transitive
description:
name: jaguar_common
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
jaguar_flutter_asset:
dependency: transitive
description:
name: jaguar_flutter_asset
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
jdenticon_dart:
dependency: "direct main"
description:
@ -668,6 +731,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
mobx:
dependency: transitive
description:
name: mobx
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6+1"
nested:
dependency: transitive
description:
@ -815,6 +885,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
path_tree:
dependency: transitive
description:
name: path_tree
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
pdf:
dependency: "direct main"
description:
@ -885,6 +962,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.4.0"
polkawallet_sdk:
dependency: "direct main"
description:
name: polkawallet_sdk
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.1"
pool:
dependency: transitive
description:
@ -1258,6 +1342,34 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
webview_flutter:
dependency: transitive
description:
name: webview_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.0"
webview_flutter_android:
dependency: transitive
description:
name: webview_flutter_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.3"
webview_flutter_platform_interface:
dependency: transitive
description:
name: webview_flutter_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
webview_flutter_wkwebview:
dependency: transitive
description:
name: webview_flutter_wkwebview
url: "https://pub.dartlang.org"
source: hosted
version: "2.7.1"
win32:
dependency: transitive
description:

View File

@ -72,6 +72,7 @@ dependencies:
desktop_window: ^0.4.0
durt: ^0.1.6
package_info_plus: ^1.3.0
polkawallet_sdk: ^0.4.1
flutter_icons:
android: "ic_launcher"