<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: siddums</title>
    <description>The latest articles on Forem by siddums (@siddums).</description>
    <link>https://forem.com/siddums</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F808487%2F42380b06-9743-4555-8f62-5ccdd4216c57.png</url>
      <title>Forem: siddums</title>
      <link>https://forem.com/siddums</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/siddums"/>
    <language>en</language>
    <item>
      <title>Integration of Huawei ML Kit Text To Speech [TTS] - Listen to your story in Flutter StoryApp
</title>
      <dc:creator>siddums</dc:creator>
      <pubDate>Fri, 04 Mar 2022 11:24:17 +0000</pubDate>
      <link>https://forem.com/siddums/integration-of-huawei-ml-kit-text-to-speech-tts-listen-to-your-story-in-flutter-storyapp-20m5</link>
      <guid>https://forem.com/siddums/integration-of-huawei-ml-kit-text-to-speech-tts-listen-to-your-story-in-flutter-storyapp-20m5</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B_8nxydv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yxqtaqlik3aomv073o1g.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B_8nxydv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yxqtaqlik3aomv073o1g.jpeg" alt="Image description" width="480" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In this article, we will be integrating Huawei ML kit in Flutter StoryApp to listen stories using ML kit Text To Speech (TTS). ML Kit provides diversified leading machine learning capabilities that are easy to use, helping you to develop various AI apps. ML Kit allows your apps to easily leverage Huawei's long-term proven expertise in machine learning to support diverse artificial intelligence (AI) applications throughout a wide range of industries. &lt;/p&gt;

&lt;p&gt;In this flutter sample application, we are using Language/Voice-related services, services are as follows. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time translation:&lt;/strong&gt; Translates text from the source language into the target language through the server on the cloud. &lt;br&gt;
&lt;strong&gt;On-device translation: **Translates text from the source language into the target language with the support of an on-device model, even when no Internet service is available. &lt;br&gt;
**Real-time language detection:&lt;/strong&gt; Detects the language of text online. Both single-language text and multi-language text are supported. &lt;br&gt;
On-device language detection: Detects the language of text without Internet connection. Both single-language text and multi-language text are supported. &lt;br&gt;
&lt;strong&gt;Automatic speech recognition:&lt;/strong&gt; Converts speech (no longer than 60 seconds) into text in real time.&lt;br&gt;
Automatic speech recognition: Converts speech (no longer than 60 seconds) into text in real time. &lt;br&gt;
&lt;strong&gt;Text to speech: **Converts text information into audio output online in real time. Rich timbres, and volume and speed options are supported to produce more natural sounds. &lt;br&gt;
**On-device text to speech:&lt;/strong&gt; Converts text information into speech with the support of an on-device model, even when there is no Internet connection. &lt;br&gt;
&lt;strong&gt;Audio file transcription:&lt;/strong&gt; Converts an audio file (no longer than 5 hours) into text. The generated text contains punctuation and timestamps. Currently, the service supports Chinese and English. &lt;br&gt;
&lt;strong&gt;Real-time transcription:&lt;/strong&gt; Converts speech (no longer than 5 hours) into text in real time. The generated text contains punctuation and timestamps. &lt;br&gt;
&lt;strong&gt;Sound detection:&lt;/strong&gt; Detects sound events in online (real-time recording) mode. The detected sound events can help you perform subsequent actions. &lt;br&gt;
Supported Devices&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YvHfyzsw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38f14r7rvwalel2lmz9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YvHfyzsw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38f14r7rvwalel2lmz9q.png" alt="Image description" width="811" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FyqBdGXT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2j04ctt8it8ed6twrac0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FyqBdGXT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2j04ctt8it8ed6twrac0.png" alt="Image description" width="880" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Development Overview&lt;/p&gt;

&lt;p&gt;You need to install Flutter and Dart plugin in IDE and I assume that you have prior knowledge about the Flutter and Dart.&lt;/p&gt;

&lt;p&gt;Hardware Requirements&lt;/p&gt;

&lt;p&gt;A computer (desktop or laptop) running Windows 10.&lt;br&gt;
Android phone (with the USB cable), which is used for debugging.&lt;br&gt;
Software Requirements&lt;/p&gt;

&lt;p&gt;Java JDK 1.7 or later.&lt;br&gt;
Android studio software or Visual Studio or Code installed.&lt;br&gt;
HMS Core (APK) 4.X or later.&lt;br&gt;
Integration process&lt;/p&gt;

&lt;p&gt;Step 1: Create Flutter project.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VklB4Kab--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xqy4osn1pl6t4mq38qd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VklB4Kab--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xqy4osn1pl6t4mq38qd2.png" alt="Image description" width="880" height="834"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qGhuhyMx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap8qapzbwukjihe5dtyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qGhuhyMx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap8qapzbwukjihe5dtyx.png" alt="Image description" width="846" height="862"&gt;&lt;/a&gt;&lt;br&gt;
Step 2: Add the App level gradle dependencies.&lt;/p&gt;

&lt;p&gt;Choose inside project Android &amp;gt; app &amp;gt; build.gradle.&lt;br&gt;
&lt;code&gt;apply plugin: 'com.android.application'&lt;br&gt;
apply plugin: 'com.huawei.agconnect'&lt;br&gt;
&lt;/code&gt; &lt;br&gt;
Root level gradle dependencies&lt;br&gt;
&lt;code&gt;maven {url 'https://developer.huawei.com/repo/'}&lt;br&gt;
classpath 'com.huawei.agconnect:agcp:1.4.1.300'&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Step 3: Add the below permissions in Android Manifest file.&lt;br&gt;
&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.CAMERA" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&amp;gt;&lt;br&gt;
&lt;/code&gt; &lt;br&gt;
Step 4: Download flutter plugins&lt;/p&gt;

&lt;p&gt;Step 5: Add downloaded file into parent directory of the project. Declare plugin path in pubspec.yaml file under dependencies. Add path location for asset image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4MOnzdfS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f7t3nb0rr8m48v31zrru.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4MOnzdfS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f7t3nb0rr8m48v31zrru.png" alt="Image description" width="880" height="322"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O_6pvkVx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fucyr4h4gmwfshzrxf8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O_6pvkVx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fucyr4h4gmwfshzrxf8v.png" alt="Image description" width="880" height="377"&gt;&lt;/a&gt;&lt;br&gt;
Let's start coding&lt;br&gt;
loginScreen.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoginScreen extends StatelessWidget {
  const LoginScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: LoginDemo(),
    );
  }
}

class LoginDemo extends StatefulWidget {
  @override
  _LoginDemoState createState() =&amp;gt; _LoginDemoState();
}

class _LoginDemoState extends State&amp;lt;LoginDemo&amp;gt; {
  final HMSAnalytics _hmsAnalytics = new HMSAnalytics();
  @override
  void initState() {
    HwAds.init();
    showSplashAd();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text("Login Page"),
        backgroundColor: Colors.grey[850],
      ),
      body: RefreshIndicator(
        onRefresh: showToast,
        child: SingleChildScrollView(
          child: Column(
            children: &amp;lt;Widget&amp;gt;[
              Padding(
                padding: const EdgeInsets.only(top: 60.0),
                child: Center(
                  child: Container(
                      width: 200,
                      height: 150,
                      decoration: BoxDecoration(
                          color: Colors.red,
                          borderRadius: BorderRadius.circular(60.0)),
                      child: Image.asset('images/logo_huawei.png')),
                ),
              ),
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 15),
                child: TextField(
                  decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: 'Email',
                      hintText: 'Enter valid email id '),
                ),
              ),
              Padding(
                padding: const EdgeInsets.only(
                    left: 15.0, right: 15.0, top: 15, bottom: 0),
                child: TextField(
                  obscureText: true,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: 'Password',
                      hintText: 'Enter password'),
                ),
              ),
              FlatButton(
                onPressed: () {
                  //TODO FORGOT PASSWORD SCREEN GOES HERE
                },
                child: Text(
                  'Forgot Password',
                  style: TextStyle(color: Colors.blue, fontSize: 15),
                ),
              ),
              Container(
                height: 50,
                width: 270,
                decoration: BoxDecoration(
                    color: Colors.red, borderRadius: BorderRadius.circular(20)),
                child: FlatButton(
                  onPressed: () async {
                    try {
                      try {
                        final bool result = await AccountAuthService.signOut();
                        if (result) {
                          final bool response =
                              await AccountAuthService.cancelAuthorization();
                        }
                      } on Exception catch (e) {
                        print(e.toString());
                      }
                    } on Exception catch (e) {
                      print(e.toString());
                    }
                  },
                  child: GestureDetector(
                    onTap: () async {
                      try {
                        final bool response =
                            await AccountAuthService.cancelAuthorization();
                      } on Exception catch (e) {
                        print(e.toString());
                      }
                    },
                    child: Text(
                      'Login',
                      style: TextStyle(color: Colors.white, fontSize: 25),
                    ),
                  ),
                ),
              ),
              SizedBox(
                height: 5,
              ),
              Container(
                height: 50,
                width: 270,
                decoration: BoxDecoration(
                    color: Colors.red, borderRadius: BorderRadius.circular(20)),
                child: HuaweiIdAuthButton(
                    theme: AuthButtonTheme.FULL_TITLE,
                    buttonColor: AuthButtonBackground.RED,
                    borderRadius: AuthButtonRadius.MEDIUM,
                    onPressed: () {
                      signInWithHuaweiAccount();
                    }),
              ),
              SizedBox(
                height: 30,
              ),
              GestureDetector(
                onTap: () {
                  //showBannerAd();
                },
                child: Text('New User? Create Account'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void signInWithHuaweiAccount() async {
    AccountAuthParamsHelper helper = new AccountAuthParamsHelper();

    helper.setAuthorizationCode();
    try {
      // The sign-in is successful, and the user's ID information and authorization code are obtained.
      Future&amp;lt;AuthAccount&amp;gt; account = AccountAuthService.signIn(helper);
      account.then((value) =&amp;gt; Fluttertoast.showToast(
          msg: "Welcome " + value.displayName.toString(),
          toastLength: Toast.LENGTH_SHORT,
          gravity: ToastGravity.CENTER,
          timeInSecForIosWeb: 1,
          backgroundColor: Colors.red,
          textColor: Colors.white,
          fontSize: 16.0));
      Navigator.push(
          context, MaterialPageRoute(builder: (_) =&amp;gt; StoryListScreen()));
    } on Exception catch (e) {
      print(e.toString());
    }
  }

  Future&amp;lt;void&amp;gt; showToast() async {
    Fluttertoast.showToast(
        msg: "Refreshing.. ",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIosWeb: 1,
        backgroundColor: Colors.lightBlue,
        textColor: Colors.white,
        fontSize: 16.0);
  }

//Show Splash Ad
  void showSplashAd() {
    SplashAd _splashAd = createSplashAd();
    _splashAd
      ..loadAd(
          adSlotId: "testq6zq98hecj",
          orientation: SplashAdOrientation.portrait,
          adParam: AdParam(),
          topMargin: 20);

    Future.delayed(Duration(seconds: 10), () {
      _splashAd.destroy();
    });
  }

  SplashAd createSplashAd() {
    SplashAd _splashAd = new SplashAd(
      adType: SplashAdType.above,
      ownerText: ' Huawei SplashAd',
      footerText: 'Test SplashAd',
    ); // Splash Ad
    return _splashAd;
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;storyListScreen.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class StoryListScreen extends StatefulWidget {
  @override
  _StoryListScreenState createState() =&amp;gt; _StoryListScreenState();
}
class _StoryListScreenState extends State&amp;lt;StoryListScreen&amp;gt; {
  final _itemExtent = 56.0;
  final generatedList = List.generate(22, (index) =&amp;gt; 'Item $index');
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stories'),
      ),
      backgroundColor: Colors.white,
      body: CustomScrollView(
        controller: ScrollController(initialScrollOffset: _itemExtent * 401),
        slivers: [
          SliverFixedExtentList(
            itemExtent: _itemExtent,
            delegate: SliverChildBuilderDelegate(
              (context, index) =&amp;gt; Card(
                margin: EdgeInsets.only(left: 12, right: 12, top: 5, bottom: 5),
                child: Center(
                  child: GestureDetector(
                    onTap: () {
                      showStory(index);
                    },
                    child: ListTile(
                      title: Text(
                        storyTitles[index],
                        style: TextStyle(
                            fontSize: 22.0, fontWeight: FontWeight.bold),
                      ),
                    ),
                  ),
                ),
              ),
              childCount: storyTitles.length,
            ),
          ),
        ],
      ),
    );
  }

  void showStory(int index) {
    print(storyTitles[index] + " Index :" + index.toString());
    Navigator.push(
        context, MaterialPageRoute(builder: (_) =&amp;gt; StoryDetails(index)));
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;storyDetails.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class StoryDetails extends StatefulWidget {
  int index;
  StoryDetails(this.index);
  @override
  _StoryDetailsState createState() =&amp;gt; new _StoryDetailsState(index);
}

class _StoryDetailsState extends State&amp;lt;StoryDetails&amp;gt; {
  int index = 0;
  MLTtsEngine? engine = null;
  bool toggle = false;
  BannerAd? _bannerAd = null;

  bool isPaused = false;

  _StoryDetailsState(this.index);

  @override
  void initState() {
    // TODO: implement initState

    initML();
    showBannerAd();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: _onBackPressed,
      child: Scaffold(
          appBar: AppBar(
            title: Text(storyTitles[index]),
            actions: &amp;lt;Widget&amp;gt;[
              IconButton(
                  icon: toggle
                      ? Icon(Icons.pause_circle_filled_outlined)
                      : Icon(
                          Icons.play_circle_fill_outlined,
                        ),
                  onPressed: () {
                    setState(() {
                      // Here we changing the icon.
                      toggle = !toggle;
                      if (toggle) {
                        if (!isPaused) {
                          // do something
                          print("......Play.....");
                          final stream = storyDetails[index].splitStream(
                            chunkSize: 499,
                            splitters: [','],
                            delimiters: [r'\'],
                          );
                          play(stream);
                        } else {
                          MLTtsEngine().resume();
                          isPaused = false;
                        }
                      } else {
                        isPaused = true;
                        MLTtsEngine().pause();
                      }
                    });
                  }),
            ],
          ),
          backgroundColor: Colors.white,
          body: SafeArea(
            child: SingleChildScrollView(
              child: Padding(
                padding: EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 50),
                child: Column(children: &amp;lt;Widget&amp;gt;[
                  Card(
                    child: Image.asset(
                        "images/image_0" + index.toString() + ".png"),
                  ),
                  Card(
                      child: Text(
                    storyDetails[index],
                    style: TextStyle(
                        color: Colors.black,
                        fontWeight: FontWeight.normal,
                        fontSize: 20),
                  )),
                  Center(
                    child: Image.asset(
                      "images/greeting.gif",
                      height: 320.0,
                      width: 620.0,
                    ),
                  ),
                ]),
              ),
            ),
          )),
    );
  }
  void showBannerAd() {
    _bannerAd = createBannerAd();
    _bannerAd!
      ..loadAd()
      ..show(gravity: Gravity.bottom, offset: 1);
  }
  //Create BannerAd
  static BannerAd createBannerAd() {
    BannerAd banner = BannerAd(
        adSlotId: "testw6vs28auh3",
        size: BannerAdSize.sSmart,
        adParam: AdParam());
    banner.setAdListener = (AdEvent event, {int? errorCode}) {
      print("Banner Ad event : $event " + banner.id.toString());
    };

    return banner;
  }
  Future&amp;lt;bool&amp;gt; _onBackPressed() async {
    if (_bannerAd != null) {
      _bannerAd?.destroy();
    }
    if (engine != null) {
      engine!.stop();
    }
    return true;
  }
  Future&amp;lt;void&amp;gt; playStory(String parts) async {
    // Create MLTtsConfig to configure the speech.
    final config = MLTtsConfig(
      language: MLTtsConstants.TTS_EN_US,
      synthesizeMode: MLTtsConstants.TTS_ONLINE_MODE,
      text: parts,
    );
    // Create an MLTtsEngine object.
    engine = new MLTtsEngine();

    // Set a listener to track tts events.
    engine?.setTtsCallback(MLTtsCallback(
      onError: _onError,
      onEvent: _onEvent,
      onAudioAvailable: _onAudioAvailable,
      onRangeStart: _onRangeStart,
      onWarn: _onWarn,
    ));

// Start the speech.
    await engine?.speak(config);
  }

  void _onError(String taskId, MLTtsError err) {

    print(err.errorMsg);
  }

  void _onEvent(String taskId, int eventId) {

  }

  void _onAudioAvailable(
      String taskId, MLTtsAudioFragment audioFragment, int offset) {

  }

  void _onRangeStart(String taskId, int start, int end) {

  }

  void _onWarn(String taskId, MLTtsWarn warn) {

  }

  Future&amp;lt;void&amp;gt; initML() async {
    MLLanguageApp().setApiKey(
        "DAED8900[p0-tu7au4ZHZuWDrR7oKps/WybCAJ0IOi7UdLfIlsIu9C4pEw0OSNA==");
  }

  Future&amp;lt;void&amp;gt; play(Stream&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; stream) async {
    int i = 0;
    await for (List&amp;lt;String&amp;gt; parts in stream) {

      // print(parts);
      if (i == 0) {
        playStory(parts.toString());
      }
      i++;
    }
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zRHKK4oe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lfj5qwax6i33wp5e0j4y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zRHKK4oe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lfj5qwax6i33wp5e0j4y.gif" alt="Image description" width="320" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tricks and Tips&lt;/p&gt;

&lt;p&gt;Make sure that downloaded plugin is unzipped in parent directory of project.&lt;br&gt;
Makes sure that agconnect-services.json file added.&lt;br&gt;
Make sure dependencies are added yaml file.&lt;br&gt;
Run flutter pug get after adding dependencies.&lt;br&gt;
Make sure that service is enabled in agc.&lt;br&gt;
Makes sure images are defined in yaml file.&lt;br&gt;
Make sure that permissions are added in Manifest file.&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;In this article, we have learnt how to integrate Huawei ML kit Text to Speech in Flutter StoryApp. It supports maximum of 500 character for one request to convert Text to Speech. Once Account kit integrated, users can login quickly and conveniently sign in to apps with their Huawei IDs after granting initial access permission. Banner and Splash Ads helps you to monetize your StoryApp.&lt;/p&gt;

&lt;p&gt;Thank you so much for reading, and also I would like to ‘thanks author for write-ups’. I hope this article helps you to understand the integration of Huawei ML Kit, Banner and Splash Ads in flutter StoryApp.&lt;/p&gt;

&lt;p&gt;Reference&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/hiai-Guides/ml-tts-0000001050068169"&gt;ML Kit Text To Speech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://momlovesbest.com/short-moral-stories-kids"&gt;StoryAuthors&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Account Kit – &lt;a href="https://developer.huawei.com/consumer/en/training/course/video/101584324766101108"&gt;Training Video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ML Kit – &lt;a href="https://developer.huawei.com/consumer/en/training/course/video/101582989856737152"&gt;Training Video&lt;/a&gt;&lt;br&gt;
&lt;a href="https://forums.developer.huawei.com/forumPortal/en/topic/0202817632333550025?ha_source=hms1"&gt;Checkout in forum&lt;/a&gt;&lt;/p&gt;

</description>
      <category>accountkit</category>
      <category>adskit</category>
      <category>mlkit</category>
    </item>
    <item>
      <title>Integrating Huawei Account, Banner and Splash Ads in Flutter StoryApp</title>
      <dc:creator>siddums</dc:creator>
      <pubDate>Fri, 25 Feb 2022 11:02:25 +0000</pubDate>
      <link>https://forem.com/siddums/integrating-huawei-account-banner-and-splash-ads-in-flutter-storyapp-1i18</link>
      <guid>https://forem.com/siddums/integrating-huawei-account-banner-and-splash-ads-in-flutter-storyapp-1i18</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L7NQmAqq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/salp5llk3zwynjjyp4vu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L7NQmAqq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/salp5llk3zwynjjyp4vu.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In this article, we will be integrating Huawei Account, Banner and Splash Ads kit in Flutter StoryApp. Flutter plugin provides simple and convenient way to experience authorization of users. Flutter Account Plugin allows users to connect to the Huawei ecosystem using their Huawei IDs from the different devices such as mobiles phones and tablets, added users can login quickly and conveniently sign in to apps with their Huawei IDs after granting initial access permission.&lt;/p&gt;

&lt;p&gt;Huawei Ads kit provides access to range of development capabilities. You can promote your apps quickly and more efficiently to Huawei’s vast users. Ads kit helps your app to monetize quickly and start generating revenue.&lt;/p&gt;

&lt;p&gt;Huawei supports following Ads&lt;/p&gt;

&lt;p&gt;Banner&lt;br&gt;
Interstitial&lt;br&gt;
Native&lt;br&gt;
Reward&lt;br&gt;
Splash&lt;br&gt;
Instream(Roll)&lt;br&gt;
Development Overview&lt;/p&gt;

&lt;p&gt;You need to install Flutter and Dart plugin in IDE and I assume that you have prior knowledge about the Flutter and Dart.&lt;/p&gt;

&lt;p&gt;Hardware Requirements&lt;/p&gt;

&lt;p&gt;A computer (desktop or laptop) running Windows 10.&lt;br&gt;
A Huawei phone (with the USB cable), which is used for debugging.&lt;br&gt;
Software Requirements&lt;/p&gt;

&lt;p&gt;Java JDK 1.7 or later.&lt;br&gt;
Android studio software or Visual Studio or Code installed.&lt;br&gt;
HMS Core (APK) 4.X or later.&lt;br&gt;
Integration process&lt;/p&gt;

&lt;p&gt;Step 1: Create Flutter project.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5JYIyIHA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztbf1eh0fw484c7v9d5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5JYIyIHA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztbf1eh0fw484c7v9d5m.png" alt="Image description" width="831" height="777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mPTngkmu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tirxh0aacbtkt0ztqh5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mPTngkmu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tirxh0aacbtkt0ztqh5r.png" alt="Image description" width="826" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Add the App level gradle dependencies.&lt;/p&gt;

&lt;p&gt;Choose inside project Android &amp;gt; app &amp;gt; build.gradle.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apply plugin: 'com.android.application'&lt;br&gt;
apply plugin: 'com.huawei.agconnect'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Root level gradle dependencies&lt;br&gt;
&lt;code&gt;maven {url 'https://developer.huawei.com/repo/'}&lt;br&gt;
classpath 'com.huawei.agconnect:agcp:1.4.1.300'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Add the below permissions in Android Manifest file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="com.huawei.appmarket.service.commondata.permission.GET_COMMON_DATA"/&amp;gt;&lt;/code&gt;&lt;br&gt;
Step 4: Download flutter plugins&lt;/p&gt;

&lt;p&gt;Step 5: Add downloaded file into parent directory of the project. Declare plugin path in pubspec.yaml file under dependencies.&lt;/p&gt;

&lt;p&gt;Add path location for asset image.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cokH7V9g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y73a8k7sakdiivhs6xwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cokH7V9g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y73a8k7sakdiivhs6xwp.png" alt="Image description" width="880" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XIdhh6Oj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b86e52f95gl5e949ucx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XIdhh6Oj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b86e52f95gl5e949ucx2.png" alt="Image description" width="880" height="271"&gt;&lt;/a&gt;&lt;br&gt;
Let's start coding&lt;/p&gt;

&lt;p&gt;loginScreen.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoginScreen extends StatelessWidget {
  const LoginScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: LoginDemo(),
    );
  }
}

class LoginDemo extends StatefulWidget {
  @override
  _LoginDemoState createState() =&amp;gt; _LoginDemoState();
}

class _LoginDemoState extends State&amp;lt;LoginDemo&amp;gt; {
  final HMSAnalytics _hmsAnalytics = new HMSAnalytics();
  @override
  void initState() {
    HwAds.init();
    showSplashAd();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text("Login Page"),
        backgroundColor: Colors.grey[850],
      ),
      body: RefreshIndicator(
        onRefresh: showToast,
        child: SingleChildScrollView(
          child: Column(
            children: &amp;lt;Widget&amp;gt;[
              Padding(
                padding: const EdgeInsets.only(top: 60.0),
                child: Center(
                  child: Container(
                      width: 200,
                      height: 150,
                      decoration: BoxDecoration(
                          color: Colors.red,
                          borderRadius: BorderRadius.circular(60.0)),
                      child: Image.asset('images/logo_huawei.png')),
                ),
              ),
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 15),
                child: TextField(
                  decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: 'Email',
                      hintText: 'Enter valid email id '),
                ),
              ),
              Padding(
                padding: const EdgeInsets.only(
                    left: 15.0, right: 15.0, top: 15, bottom: 0),
                child: TextField(
                  obscureText: true,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: 'Password',
                      hintText: 'Enter password'),
                ),
              ),
              FlatButton(
                onPressed: () {
                  //TODO FORGOT PASSWORD SCREEN GOES HERE
                },
                child: Text(
                  'Forgot Password',
                  style: TextStyle(color: Colors.blue, fontSize: 15),
                ),
              ),
              Container(
                height: 50,
                width: 270,
                decoration: BoxDecoration(
                    color: Colors.red, borderRadius: BorderRadius.circular(20)),
                child: FlatButton(
                  onPressed: () async {
                    try {
                      try {
                        final bool result = await AccountAuthService.signOut();
                        if (result) {
                          final bool response =
                              await AccountAuthService.cancelAuthorization();
                        }
                      } on Exception catch (e) {
                        print(e.toString());
                      }
                    } on Exception catch (e) {
                      print(e.toString());
                    }
                  },
                  child: GestureDetector(
                    onTap: () async {
                      try {
                        final bool response =
                            await AccountAuthService.cancelAuthorization();
                      } on Exception catch (e) {
                        print(e.toString());
                      }
                    },
                    child: Text(
                      'Login',
                      style: TextStyle(color: Colors.white, fontSize: 25),
                    ),
                  ),
                ),
              ),
              SizedBox(
                height: 5,
              ),
              Container(
                height: 50,
                width: 270,
                decoration: BoxDecoration(
                    color: Colors.red, borderRadius: BorderRadius.circular(20)),
                child: HuaweiIdAuthButton(
                    theme: AuthButtonTheme.FULL_TITLE,
                    buttonColor: AuthButtonBackground.RED,
                    borderRadius: AuthButtonRadius.MEDIUM,
                    onPressed: () {
                      signInWithHuaweiAccount();
                    }),
              ),
              SizedBox(
                height: 30,
              ),
              GestureDetector(
                onTap: () {
                  //showBannerAd();
                },
                child: Text('New User? Create Account'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void signInWithHuaweiAccount() async {
    AccountAuthParamsHelper helper = new AccountAuthParamsHelper();

    helper.setAuthorizationCode();
    try {
      // The sign-in is successful, and the user's ID information and authorization code are obtained.
      Future&amp;lt;AuthAccount&amp;gt; account = AccountAuthService.signIn(helper);
      account.then((value) =&amp;gt; Fluttertoast.showToast(
          msg: "Welcome " + value.displayName.toString(),
          toastLength: Toast.LENGTH_SHORT,
          gravity: ToastGravity.CENTER,
          timeInSecForIosWeb: 1,
          backgroundColor: Colors.red,
          textColor: Colors.white,
          fontSize: 16.0));
      Navigator.push(
          context, MaterialPageRoute(builder: (_) =&amp;gt; StoryListScreen()));
    } on Exception catch (e) {
      print(e.toString());
    }
  }

  Future&amp;lt;void&amp;gt; showToast() async {
    Fluttertoast.showToast(
        msg: "Refreshing.. ",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIosWeb: 1,
        backgroundColor: Colors.lightBlue,
        textColor: Colors.white,
        fontSize: 16.0);
  }

//Show Splash Ad
  void showSplashAd() {
    SplashAd _splashAd = createSplashAd();
    _splashAd
      ..loadAd(
          adSlotId: "testq6zq98hecj",
          orientation: SplashAdOrientation.portrait,
          adParam: AdParam(),
          topMargin: 20);

    Future.delayed(Duration(seconds: 10), () {
      _splashAd.destroy();
    });
  }

  SplashAd createSplashAd() {
    SplashAd _splashAd = new SplashAd(
      adType: SplashAdType.above,
      ownerText: ' Huawei SplashAd',
      footerText: 'Test SplashAd',
    ); // Splash Ad
    return _splashAd;
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;storyListScreen.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class StoryListScreen extends StatefulWidget {
  @override
  _StoryListScreenState createState() =&amp;gt; _StoryListScreenState();
}

class _StoryListScreenState extends State&amp;lt;StoryListScreen&amp;gt; {
  final _itemExtent = 56.0;
  final generatedList = List.generate(22, (index) =&amp;gt; 'Item $index');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stories'),
      ),
      backgroundColor: Colors.white,
      body: CustomScrollView(
        controller: ScrollController(initialScrollOffset: _itemExtent * 401),
        slivers: [
          SliverFixedExtentList(
            itemExtent: _itemExtent,
            delegate: SliverChildBuilderDelegate(
              (context, index) =&amp;gt; Card(
                margin: EdgeInsets.only(left: 12, right: 12, top: 5, bottom: 5),
                child: Center(
                  child: GestureDetector(
                    onTap: () {
                      showStory(index);
                    },
                    child: ListTile(
                      title: Text(
                        storyTitles[index],
                        style: TextStyle(
                            fontSize: 22.0, fontWeight: FontWeight.bold),
                      ),
                    ),
                  ),
                ),
              ),
              childCount: storyTitles.length,
            ),
          ),
        ],
      ),
    );
  }

  void showStory(int index) {
    print(storyTitles[index] + " Index :" + index.toString());
    Navigator.push(
        context, MaterialPageRoute(builder: (_) =&amp;gt; StoryDetails(index)));
  }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;storyDetails.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class StoryDetails extends StatefulWidget {
  int index;
  StoryDetails(this.index);
  @override
  _StoryDetailsState createState() =&amp;gt; new _StoryDetailsState(index);
}
class _StoryDetailsState extends State&amp;lt;StoryDetails&amp;gt; {
  int index;
  BannerAd? _bannerAd = null;
  _StoryDetailsState(this.index);
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    showBannerAd();
  }
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: _onBackPressed,
      child: Scaffold(
          appBar: AppBar(
            title: Text(storyTitles[index]),
          ),
          backgroundColor: Colors.white,
          body: SafeArea(
            child: SingleChildScrollView(
              child: Padding(
                padding: EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 50),
                child: Column(children: &amp;lt;Widget&amp;gt;[
                  Card(
                    child: Image.asset(
                        "images/image_0" + index.toString() + ".png"),
                  ),
                  Card(
                      child: Text(
                    storyDetails[index],
                    style: TextStyle(
                        color: Colors.black,
                        fontWeight: FontWeight.normal,
                        fontSize: 20),
                  )),
                  Center(
                    child: Image.asset(
                      "images/greeting.gif",
                      height: 320.0,
                      width: 620.0,
                    ),
                  ),
                ]),
              ),
            ),
          )),
    );
  }
  void showBannerAd() {
    _bannerAd = createBannerAd();
    _bannerAd!
      ..loadAd()
      ..show(gravity: Gravity.bottom, offset: 1);
  }
  //Create BannerAd
  static BannerAd createBannerAd() {
    BannerAd banner = BannerAd(
        adSlotId: "testw6vs28auh3",
        size: BannerAdSize.sSmart,
        adParam: AdParam());
    banner.setAdListener = (AdEvent event, {int? errorCode}) {
      print("Banner Ad event : $event " + banner.id.toString());
    };

    return banner;
  }
  Future&amp;lt;bool&amp;gt; _onBackPressed() async {
    if (_bannerAd != null) {
      _bannerAd?.destroy();
    }
    return true;
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4HcpRith--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73v33sofyvnuaew0h9zl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4HcpRith--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73v33sofyvnuaew0h9zl.gif" alt="Image description" width="216" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tricks and Tips&lt;/p&gt;

&lt;p&gt;Make sure that downloaded plugin is unzipped in parent directory of project.&lt;br&gt;
Makes sure that agconnect-services.json file added.&lt;br&gt;
Make sure dependencies are added yaml file.&lt;br&gt;
Run flutter pug get after adding dependencies.&lt;br&gt;
Make sure that service is enabled in agc.&lt;br&gt;
Makes sure images are defined in yaml file.&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;we have learnt how to integrate Huawei Account kit and Huawei Banner and Splash Ads in Flutter StoryApp. Once Account kit integrated, users can login quickly and conveniently sign in to apps with their Huawei IDs after granting initial access permission. Banner and Splash Ads helps you to monetize your StoryApp.&lt;/p&gt;

&lt;p&gt;Thank you so much for reading, and also I would like to 'thanks author for write-ups'. I hope this article helps you to understand the integration of Huawei Account kit, Huawei Banner and Splash Ads in flutter StoryApp.&lt;/p&gt;

&lt;p&gt;Reference&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/HMS-Plugin-Guides/publisher-service-0000001050196431"&gt;Ads Kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://momlovesbest.com/short-moral-stories-kids"&gt;StoryAuthors&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ads Kit – &lt;a href="https://developer.huawei.com/consumer/en/training/course/video/101582989856737152"&gt;Training Video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Account Kit – &lt;a href="https://developer.huawei.com/consumer/en/training/course/video/101584324766101108"&gt;Training Video&lt;/a&gt;&lt;/p&gt;

</description>
      <category>huaweiaccountkit</category>
      <category>huaweiadsk</category>
      <category>huaweideveloper</category>
      <category>hmscore</category>
    </item>
    <item>
      <title>Implementing Huawei Analytics and Ads kit in Flutter StoryApp</title>
      <dc:creator>siddums</dc:creator>
      <pubDate>Fri, 18 Feb 2022 13:37:10 +0000</pubDate>
      <link>https://forem.com/siddums/implementing-huawei-analytics-and-ads-kit-in-flutter-storyapp-5cl2</link>
      <guid>https://forem.com/siddums/implementing-huawei-analytics-and-ads-kit-in-flutter-storyapp-5cl2</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hGKiVdDE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zyimwcot4sio6zunbakw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hGKiVdDE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zyimwcot4sio6zunbakw.png" alt="Image description" width="554" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In this article, we will be integrating Huawei Account, Analytics and Ads kit in StoryApp. Flutter plugin provides simple and convenient way to experience authorization of users. Flutter Account Plugin allows users to connect to the Huawei ecosystem using their Huawei IDs from the different devices such as mobiles phones and tablets, added users can login quickly and conveniently sign in to apps with their Huawei IDs after granting initial access permission.&lt;/p&gt;

&lt;p&gt;Huawei Ads kit provides access to range of development capabilities. You can promote your apps quickly and more efficiently to Huawei’s vast users. Ads kit helps your app to be monetize quickly and start generating revenue.&lt;/p&gt;

&lt;p&gt;Huawei supports following Ads types&lt;/p&gt;

&lt;p&gt;Banner&lt;br&gt;
Interstitial&lt;br&gt;
Native&lt;br&gt;
Reward&lt;br&gt;
Splash&lt;br&gt;
Instream(Roll)&lt;br&gt;
Flutter Analytics Plugin provides wider range of predefined analytics models to get more insight into your application users, products, and content. With this insight, you can prepare data-driven approach to market your apps and optimize your products based on the analytics.&lt;/p&gt;

&lt;p&gt;With Analytics Kit's on-device data collection SDK, you can:&lt;/p&gt;

&lt;p&gt;Collect and report custom events.&lt;br&gt;
Set a maximum of 25 user attributes.&lt;br&gt;
Automate event collection and session calculation.&lt;br&gt;
Pre-set event IDs and parameters.&lt;br&gt;
Restrictions&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;  Devices:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;a.    Analytics Kit depends on HMS Core (APK) to automatically collect the following events: INSTALLAPP (app installation), UNINSTALLAPP (app uninstallation), CLEARNOTIFICATION (data deletion), INAPPPURCHASE (in-app purchase), RequestAd (ad request), DisplayAd (ad display), ClickAd (ad tapping), ObtainAdAward (ad award claiming), SIGNIN (sign-in), and SIGNOUT (sign-out). These events cannot be automatically collected on third-party devices where HMS Core (APK) is not installed (including but not limited to OPPO, vivo, Xiaomi, Samsung, and OnePlus).&lt;/p&gt;

&lt;p&gt;b.   Analytics Kit does not work on iOS devices.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;  Number of events:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A maximum of 500 events are supported.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;  Number of event parameters:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can define a maximum of 25 parameters for each event, and a maximum of 100 event parameters for each project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;  Supported countries/regions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The service is now available only in the countries/regions listed in Supported Countries/Regions.&lt;/p&gt;

&lt;p&gt;Development Overview&lt;/p&gt;

&lt;p&gt;You need to install Flutter and Dart plugin in IDE and I assume that you have prior knowledge about the Flutter and Dart.&lt;/p&gt;

&lt;p&gt;Hardware Requirements&lt;/p&gt;

&lt;p&gt;A computer (desktop or laptop) running Windows 10.&lt;br&gt;
A Huawei phone (with the USB cable), which is used for debugging.&lt;br&gt;
Software Requirements&lt;/p&gt;

&lt;p&gt;Java JDK 1.7 or later.&lt;br&gt;
 Android studio software or Visual Studio or Code installed.&lt;br&gt;
 HMS Core (APK) 4.X or later.&lt;br&gt;
Integration process&lt;/p&gt;

&lt;p&gt;Step 1: Create flutter project.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LU-R4wOz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvqu64hsl46wv2wk8v13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LU-R4wOz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvqu64hsl46wv2wk8v13.png" alt="Image description" width="831" height="777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5i83w6Rs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehttjc03m4l48bcgnkmc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5i83w6Rs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehttjc03m4l48bcgnkmc.png" alt="Image description" width="826" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Add the App level gradle dependencies. Choose inside project Android &amp;gt; app &amp;gt; build.gradle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply plugin: 'com.android.application'

apply plugin: 'com.huawei.agconnect'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Root level gradle dependencies&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;maven {url 'https://developer.huawei.com/repo/'}

classpath 'com.huawei.agconnect:agcp:1.4.1.300'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Add the below permissions in Android Manifest file.&lt;br&gt;
`&lt;/p&gt;



&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;Step 4: Download flutter plugins&lt;/p&gt;

&lt;p&gt;Step 5: Add downloaded file into parent directory of the project. Declare plugin path in pubspec.yaml file under dependencies.&lt;/p&gt;

&lt;p&gt;Add path location for asset image.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GZOs7p7d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/675035rmp08mldqthxle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GZOs7p7d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/675035rmp08mldqthxle.png" alt="Image description" width="880" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H-OeUJQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pfm8lnvvm61zb7uiwi3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H-OeUJQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pfm8lnvvm61zb7uiwi3.png" alt="Image description" width="880" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's start coding&lt;/p&gt;

&lt;p&gt;loginScreen.dart&lt;/p&gt;

&lt;p&gt;`class LoginScreen extends StatelessWidget {&lt;/p&gt;

&lt;p&gt;const LoginScreen({Key? key}) : super(key: key);&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;Widget build(BuildContext context) {&lt;/p&gt;

&lt;p&gt;return MaterialApp(&lt;/p&gt;

&lt;p&gt;debugShowCheckedModeBanner: false,&lt;/p&gt;

&lt;p&gt;home: LoginDemo(),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;class LoginDemo extends StatefulWidget {&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;_LoginDemoState createState() =&amp;gt; _LoginDemoState();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;class _LoginDemoState extends State {&lt;/p&gt;

&lt;p&gt;final HMSAnalytics _hmsAnalytics = new HMSAnalytics();&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;void initState() {&lt;/p&gt;

&lt;p&gt;// TODO: implement initState&lt;/p&gt;

&lt;p&gt;HwAds.init();&lt;/p&gt;

&lt;p&gt;_enableLog();&lt;/p&gt;

&lt;p&gt;_predefinedEvent();&lt;/p&gt;

&lt;p&gt;showBannerAd();&lt;/p&gt;

&lt;p&gt;super.initState();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Future _enableLog() async {&lt;/p&gt;

&lt;p&gt;_hmsAnalytics.setUserId("TestUserStoryApp");&lt;/p&gt;

&lt;p&gt;await _hmsAnalytics.enableLog();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void _predefinedEvent() async {&lt;/p&gt;

&lt;p&gt;String name = HAEventType.SIGNIN;&lt;/p&gt;

&lt;p&gt;dynamic value = {HAParamType.ENTRY: 06534797};&lt;/p&gt;

&lt;p&gt;await _hmsAnalytics.onEvent(name, value);&lt;/p&gt;

&lt;p&gt;print("Event posted");&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;Widget build(BuildContext context) {&lt;/p&gt;

&lt;p&gt;return Scaffold(&lt;/p&gt;

&lt;p&gt;backgroundColor: Colors.white,&lt;/p&gt;

&lt;p&gt;appBar: AppBar(&lt;/p&gt;

&lt;p&gt;title: Text("Login Page"),&lt;/p&gt;

&lt;p&gt;backgroundColor: Colors.grey[850],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;body: RefreshIndicator(&lt;/p&gt;

&lt;p&gt;onRefresh: showToast,&lt;/p&gt;

&lt;p&gt;child: SingleChildScrollView(&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Padding(&lt;/p&gt;

&lt;p&gt;padding: const EdgeInsets.only(top: 60.0),&lt;/p&gt;

&lt;p&gt;child: Center(&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;width: 200,&lt;/p&gt;

&lt;p&gt;height: 150,&lt;/p&gt;

&lt;p&gt;decoration: BoxDecoration(&lt;/p&gt;

&lt;p&gt;color: Colors.red,&lt;/p&gt;

&lt;p&gt;borderRadius: BorderRadius.circular(60.0)),&lt;/p&gt;

&lt;p&gt;child: Image.asset('images/logo_huawei.png')),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Padding(&lt;/p&gt;

&lt;p&gt;padding: EdgeInsets.symmetric(horizontal: 15),&lt;/p&gt;

&lt;p&gt;child: TextField(&lt;/p&gt;

&lt;p&gt;decoration: InputDecoration(&lt;/p&gt;

&lt;p&gt;border: OutlineInputBorder(),&lt;/p&gt;

&lt;p&gt;labelText: 'Email',&lt;/p&gt;

&lt;p&gt;hintText: 'Enter valid email id '),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Padding(&lt;/p&gt;

&lt;p&gt;padding: const EdgeInsets.only(&lt;/p&gt;

&lt;p&gt;left: 15.0, right: 15.0, top: 15, bottom: 0),&lt;/p&gt;

&lt;p&gt;child: TextField(&lt;/p&gt;

&lt;p&gt;obscureText: true,&lt;/p&gt;

&lt;p&gt;decoration: InputDecoration(&lt;/p&gt;

&lt;p&gt;border: OutlineInputBorder(),&lt;/p&gt;

&lt;p&gt;labelText: 'Password',&lt;/p&gt;

&lt;p&gt;hintText: 'Enter password'),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;FlatButton(&lt;/p&gt;

&lt;p&gt;onPressed: () {&lt;/p&gt;

&lt;p&gt;//TODO FORGOT PASSWORD SCREEN GOES HERE&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Text(&lt;/p&gt;

&lt;p&gt;'Forgot Password',&lt;/p&gt;

&lt;p&gt;style: TextStyle(color: Colors.blue, fontSize: 15),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Container(&lt;/p&gt;

&lt;p&gt;height: 50,&lt;/p&gt;

&lt;p&gt;width: 270,&lt;/p&gt;

&lt;p&gt;decoration: BoxDecoration(&lt;/p&gt;

&lt;p&gt;color: Colors.red, borderRadius: BorderRadius.circular(20)),&lt;/p&gt;

&lt;p&gt;child: FlatButton(&lt;/p&gt;

&lt;p&gt;onPressed: () async {&lt;/p&gt;

&lt;p&gt;try {&lt;/p&gt;

&lt;p&gt;try {&lt;/p&gt;

&lt;p&gt;final bool result = await AccountAuthService.signOut();&lt;/p&gt;

&lt;p&gt;if (result) {&lt;/p&gt;

&lt;p&gt;final bool response =&lt;/p&gt;

&lt;p&gt;await AccountAuthService.cancelAuthorization();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;} on Exception catch (e) {&lt;/p&gt;

&lt;p&gt;print(e.toString());&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;} on Exception catch (e) {&lt;/p&gt;

&lt;p&gt;print(e.toString());&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: GestureDetector(&lt;/p&gt;

&lt;p&gt;onTap: () async {&lt;/p&gt;

&lt;p&gt;try {&lt;/p&gt;

&lt;p&gt;final bool response =&lt;/p&gt;

&lt;p&gt;await AccountAuthService.cancelAuthorization();&lt;/p&gt;

&lt;p&gt;} on Exception catch (e) {&lt;/p&gt;

&lt;p&gt;print(e.toString());&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Text(&lt;/p&gt;

&lt;p&gt;'Login',&lt;/p&gt;

&lt;p&gt;style: TextStyle(color: Colors.white, fontSize: 25),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;SizedBox(&lt;/p&gt;

&lt;p&gt;height: 5,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Container(&lt;/p&gt;

&lt;p&gt;height: 50,&lt;/p&gt;

&lt;p&gt;width: 270,&lt;/p&gt;

&lt;p&gt;decoration: BoxDecoration(&lt;/p&gt;

&lt;p&gt;color: Colors.red, borderRadius: BorderRadius.circular(20)),&lt;/p&gt;

&lt;p&gt;child: HuaweiIdAuthButton(&lt;/p&gt;

&lt;p&gt;theme: AuthButtonTheme.FULL_TITLE,&lt;/p&gt;

&lt;p&gt;buttonColor: AuthButtonBackground.RED,&lt;/p&gt;

&lt;p&gt;borderRadius: AuthButtonRadius.MEDIUM,&lt;/p&gt;

&lt;p&gt;onPressed: () {&lt;/p&gt;

&lt;p&gt;signInWithHuaweiAccount();&lt;/p&gt;

&lt;p&gt;}),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;SizedBox(&lt;/p&gt;

&lt;p&gt;height: 30,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;GestureDetector(&lt;/p&gt;

&lt;p&gt;onTap: () {&lt;/p&gt;

&lt;p&gt;showBannerAd();&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Text('New User? Create Account'),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void showBannerAd() {&lt;/p&gt;

&lt;p&gt;BannerAd _bannerAd;&lt;/p&gt;

&lt;p&gt;_bannerAd = createBannerAd();&lt;/p&gt;

&lt;p&gt;_bannerAd&lt;/p&gt;

&lt;p&gt;..loadAd()&lt;/p&gt;

&lt;p&gt;..show(gravity: Gravity.bottom, offset: 5);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;//Create BannerAd&lt;/p&gt;

&lt;p&gt;static BannerAd createBannerAd() {&lt;/p&gt;

&lt;p&gt;BannerAd banner = BannerAd(&lt;/p&gt;

&lt;p&gt;adSlotId: "testw6vs28auh3",&lt;/p&gt;

&lt;p&gt;size: BannerAdSize.sSmart,&lt;/p&gt;

&lt;p&gt;adParam: AdParam());&lt;/p&gt;

&lt;p&gt;banner.setAdListener = (AdEvent event, {int? errorCode}) {&lt;/p&gt;

&lt;p&gt;print("Banner Ad event : $event");&lt;/p&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;return banner;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void signInWithHuaweiAccount() async {&lt;/p&gt;

&lt;p&gt;AccountAuthParamsHelper helper = new AccountAuthParamsHelper();&lt;/p&gt;

&lt;p&gt;helper.setAuthorizationCode();&lt;/p&gt;

&lt;p&gt;try {&lt;/p&gt;

&lt;p&gt;// The sign-in is successful, and the user's ID information and authorization code are obtained.&lt;/p&gt;

&lt;p&gt;Future account = AccountAuthService.signIn(helper);&lt;/p&gt;

&lt;p&gt;account.then((value) =&amp;gt; Fluttertoast.showToast(&lt;/p&gt;

&lt;p&gt;msg: "Welcome " + value.displayName.toString(),&lt;/p&gt;

&lt;p&gt;toastLength: Toast.LENGTH_SHORT,&lt;/p&gt;

&lt;p&gt;gravity: ToastGravity.CENTER,&lt;/p&gt;

&lt;p&gt;timeInSecForIosWeb: 1,&lt;/p&gt;

&lt;p&gt;backgroundColor: Colors.red,&lt;/p&gt;

&lt;p&gt;textColor: Colors.white,&lt;/p&gt;

&lt;p&gt;fontSize: 16.0));&lt;/p&gt;

&lt;p&gt;Navigator.push(context, MaterialPageRoute(builder: (_) =&amp;gt; Main1()));&lt;/p&gt;

&lt;p&gt;} on Exception catch (e) {&lt;/p&gt;

&lt;p&gt;print(e.toString());&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Future showToast() async {&lt;/p&gt;

&lt;p&gt;Fluttertoast.showToast(&lt;/p&gt;

&lt;p&gt;msg: "Refreshing.. ",&lt;/p&gt;

&lt;p&gt;toastLength: Toast.LENGTH_SHORT,&lt;/p&gt;

&lt;p&gt;gravity: ToastGravity.CENTER,&lt;/p&gt;

&lt;p&gt;timeInSecForIosWeb: 1,&lt;/p&gt;

&lt;p&gt;backgroundColor: Colors.lightBlue,&lt;/p&gt;

&lt;p&gt;textColor: Colors.white,&lt;/p&gt;

&lt;p&gt;fontSize: 16.0);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;BannerAd createAd() {&lt;/p&gt;

&lt;p&gt;return BannerAd(&lt;/p&gt;

&lt;p&gt;adSlotId: "testw6vs28auh3",&lt;/p&gt;

&lt;p&gt;size: BannerAdSize.s468x60,&lt;/p&gt;

&lt;p&gt;adParam: AdParam(),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}`&lt;/p&gt;

&lt;p&gt;Main.dart&lt;/p&gt;

&lt;p&gt;`class Main extends StatefulWidget {&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;_Main1State createState() =&amp;gt; _Main1State();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;var cardAspectRation = 12.0 / 20.0;&lt;/p&gt;

&lt;p&gt;var widgetAspectRatio = cardAspectRation * 1.2;&lt;/p&gt;

&lt;p&gt;var verticalInset = 20.0;&lt;/p&gt;

&lt;p&gt;class _Main1State extends State {&lt;/p&gt;

&lt;p&gt;var currentPage = images.length - 1.0;&lt;/p&gt;

&lt;p&gt;bool isMenuClosed = true;&lt;/p&gt;

&lt;p&gt;late double screenWidth;&lt;/p&gt;

&lt;p&gt;final HMSAnalytics _hmsAnalytics = new HMSAnalytics();&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;void dispose() {&lt;/p&gt;

&lt;p&gt;// SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);&lt;/p&gt;

&lt;p&gt;super.dispose();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;initState() {&lt;/p&gt;

&lt;p&gt;// SystemChrome.setEnabledSystemUIOverlays([]);&lt;/p&gt;

&lt;p&gt;super.initState();&lt;/p&gt;

&lt;p&gt;_enableLog();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Future _enableLog() async {&lt;/p&gt;

&lt;p&gt;_hmsAnalytics.setUserId("TestUserStoryApp");&lt;/p&gt;

&lt;p&gt;await _hmsAnalytics.enableLog();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;Widget build(BuildContext context) {&lt;/p&gt;

&lt;p&gt;// The initial todos&lt;/p&gt;

&lt;p&gt;PageController controller = PageController(initialPage: images.length - 1);&lt;/p&gt;

&lt;p&gt;controller.addListener(() {&lt;/p&gt;

&lt;p&gt;setState(() {&lt;/p&gt;

&lt;p&gt;currentPage = controller.page!;&lt;/p&gt;

&lt;p&gt;});&lt;/p&gt;

&lt;p&gt;});&lt;/p&gt;

&lt;p&gt;Size size = MediaQuery.of(context).size;&lt;/p&gt;

&lt;p&gt;screenWidth = size.width;&lt;/p&gt;

&lt;p&gt;return Scaffold(&lt;/p&gt;

&lt;p&gt;backgroundColor: Colors.grey[850],&lt;/p&gt;

&lt;p&gt;body: Stack(&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;menu(context),&lt;/p&gt;

&lt;p&gt;dashboard(context),&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Widget menu(context) {&lt;/p&gt;

&lt;p&gt;return Padding(&lt;/p&gt;

&lt;p&gt;padding: EdgeInsets.fromLTRB(0, 0, screenWidth * 0.15, 0),&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;mainAxisAlignment: MainAxisAlignment.center,&lt;/p&gt;

&lt;p&gt;crossAxisAlignment: CrossAxisAlignment.start,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;flex: 4,&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;color: Colors.grey[850],&lt;/p&gt;

&lt;p&gt;child: Align(&lt;/p&gt;

&lt;p&gt;alignment: Alignment.center,&lt;/p&gt;

&lt;p&gt;child: circularImage(),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;flex: 6,&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;child: Row(&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;child: GestureDetector(&lt;/p&gt;

&lt;p&gt;onTap: () {&lt;/p&gt;

&lt;p&gt;print("Clicked on Ads");&lt;/p&gt;

&lt;p&gt;Navigator.push(&lt;/p&gt;

&lt;p&gt;context,&lt;/p&gt;

&lt;p&gt;MaterialPageRoute(&lt;/p&gt;

&lt;p&gt;builder: (_) =&amp;gt; SecondScreen()));&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;decoration: new BoxDecoration(&lt;/p&gt;

&lt;p&gt;color: Color.fromRGBO(218, 107, 107, 1),&lt;/p&gt;

&lt;p&gt;borderRadius: new BorderRadius.only(&lt;/p&gt;

&lt;p&gt;topLeft: const Radius.circular(80.0))),&lt;/p&gt;

&lt;p&gt;child: Align(&lt;/p&gt;

&lt;p&gt;alignment: Alignment.center,&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;mainAxisAlignment: MainAxisAlignment.center,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Icon(&lt;/p&gt;

&lt;p&gt;Icons.headset,&lt;/p&gt;

&lt;p&gt;color: Colors.white,&lt;/p&gt;

&lt;p&gt;size: 50,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Text('Ads',&lt;/p&gt;

&lt;p&gt;style: TextStyle(&lt;/p&gt;

&lt;p&gt;color: Colors.white, fontSize: 22))&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;child: GestureDetector(&lt;/p&gt;

&lt;p&gt;onTap: () {&lt;/p&gt;

&lt;p&gt;print("Clicked on browse");&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;color: Color.fromRGBO(211, 96, 96, 1),&lt;/p&gt;

&lt;p&gt;child: Align(&lt;/p&gt;

&lt;p&gt;alignment: Alignment.center,&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;mainAxisAlignment: MainAxisAlignment.center,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Icon(&lt;/p&gt;

&lt;p&gt;Icons.satellite,&lt;/p&gt;

&lt;p&gt;color: Colors.white,&lt;/p&gt;

&lt;p&gt;size: 50,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Text('Browse',&lt;/p&gt;

&lt;p&gt;style: TextStyle(&lt;/p&gt;

&lt;p&gt;color: Colors.white, fontSize: 22))&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;child: GestureDetector(&lt;/p&gt;

&lt;p&gt;onTap: () {&lt;/p&gt;

&lt;p&gt;print("Clicked on Analytics");&lt;/p&gt;

&lt;p&gt;sendCustomEvent();&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;decoration: new BoxDecoration(&lt;/p&gt;

&lt;p&gt;color: Color.fromRGBO(211, 96, 96, 1),&lt;/p&gt;

&lt;p&gt;borderRadius: new BorderRadius.only(&lt;/p&gt;

&lt;p&gt;topRight: const Radius.circular(80.0))),&lt;/p&gt;

&lt;p&gt;child: Align(&lt;/p&gt;

&lt;p&gt;alignment: Alignment.center,&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;mainAxisAlignment: MainAxisAlignment.center,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Icon(&lt;/p&gt;

&lt;p&gt;Icons.assignment,&lt;/p&gt;

&lt;p&gt;color: Colors.white,&lt;/p&gt;

&lt;p&gt;size: 50,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Text('Analytics',&lt;/p&gt;

&lt;p&gt;style: TextStyle(&lt;/p&gt;

&lt;p&gt;color: Colors.white, fontSize: 22))&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Flexible(&lt;/p&gt;

&lt;p&gt;child: GestureDetector(&lt;/p&gt;

&lt;p&gt;onTap: () {&lt;/p&gt;

&lt;p&gt;print("Clicked on settings");&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;color: Color.fromRGBO(218, 107, 107, 1),&lt;/p&gt;

&lt;p&gt;child: Align(&lt;/p&gt;

&lt;p&gt;alignment: Alignment.center,&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;mainAxisAlignment: MainAxisAlignment.center,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Icon(&lt;/p&gt;

&lt;p&gt;Icons.settings,&lt;/p&gt;

&lt;p&gt;color: Colors.white,&lt;/p&gt;

&lt;p&gt;size: 50,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Text('Settings',&lt;/p&gt;

&lt;p&gt;style: TextStyle(&lt;/p&gt;

&lt;p&gt;color: Colors.white, fontSize: 22))&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Widget dashboard(context) {&lt;/p&gt;

&lt;p&gt;return AnimatedPositioned(&lt;/p&gt;

&lt;p&gt;//top: isMenuClosed? 0 : 100,&lt;/p&gt;

&lt;p&gt;//bottom: isMenuClosed? 0 : 100,&lt;/p&gt;

&lt;p&gt;top: 0,&lt;/p&gt;

&lt;p&gt;bottom: 0,&lt;/p&gt;

&lt;p&gt;left: isMenuClosed ? 0 : screenWidth - screenWidth * 0.15,&lt;/p&gt;

&lt;p&gt;right: isMenuClosed ? 0 : -90,&lt;/p&gt;

&lt;p&gt;duration: Duration(milliseconds: 300),&lt;/p&gt;

&lt;p&gt;child: Material(&lt;/p&gt;

&lt;p&gt;elevation: 8,&lt;/p&gt;

&lt;p&gt;color: Colors.grey[850],&lt;/p&gt;

&lt;p&gt;child: Padding(&lt;/p&gt;

&lt;p&gt;padding: EdgeInsets.fromLTRB(10, 30, 10, 10),&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Row(&lt;/p&gt;

&lt;p&gt;mainAxisAlignment: MainAxisAlignment.spaceBetween,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;InkWell(&lt;/p&gt;

&lt;p&gt;child: Icon(&lt;/p&gt;

&lt;p&gt;Icons.segment,&lt;/p&gt;

&lt;p&gt;color: Colors.white,&lt;/p&gt;

&lt;p&gt;size: 40,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;onTap: () {&lt;/p&gt;

&lt;p&gt;setState(() {&lt;/p&gt;

&lt;p&gt;isMenuClosed = !isMenuClosed;&lt;/p&gt;

&lt;p&gt;});&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Icon(&lt;/p&gt;

&lt;p&gt;Icons.search_outlined,&lt;/p&gt;

&lt;p&gt;color: Colors.white,&lt;/p&gt;

&lt;p&gt;size: 40,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Text("Trending",&lt;/p&gt;

&lt;p&gt;style: TextStyle(fontSize: 28, color: Colors.white)),&lt;/p&gt;

&lt;p&gt;CardScrollWidget(currentPage),&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Widget circularImage() {&lt;/p&gt;

&lt;p&gt;return Container(&lt;/p&gt;

&lt;p&gt;width: 200.0,&lt;/p&gt;

&lt;p&gt;height: 200.0,&lt;/p&gt;

&lt;p&gt;decoration: new BoxDecoration(&lt;/p&gt;

&lt;p&gt;shape: BoxShape.circle,&lt;/p&gt;

&lt;p&gt;border: Border.all(&lt;/p&gt;

&lt;p&gt;color: Colors.teal, width: 10.0, style: BorderStyle.solid),&lt;/p&gt;

&lt;p&gt;image: new DecorationImage(&lt;/p&gt;

&lt;p&gt;fit: BoxFit.cover, image: AssetImage("images/logo_huawei.png"))),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void sendCustomEvent() async {&lt;/p&gt;

&lt;p&gt;String value = "This is custom event from app";&lt;/p&gt;

&lt;p&gt;dynamic eventData = {'Message': value};&lt;/p&gt;

&lt;p&gt;await _hmsAnalytics.onEvent("CustomEvent", eventData);&lt;/p&gt;

&lt;p&gt;print("Event posted");&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;class CardScrollWidget extends StatelessWidget {&lt;/p&gt;

&lt;p&gt;var currentPage;&lt;/p&gt;

&lt;p&gt;var padding = 20.0;&lt;/p&gt;

&lt;p&gt;CardScrollWidget(this.currentPage);&lt;/p&gt;

&lt;p&gt;@override&lt;/p&gt;

&lt;p&gt;Widget build(BuildContext context) {&lt;/p&gt;

&lt;p&gt;return AspectRatio(&lt;/p&gt;

&lt;p&gt;aspectRatio: widgetAspectRatio,&lt;/p&gt;

&lt;p&gt;child: LayoutBuilder(&lt;/p&gt;

&lt;p&gt;builder: (context, constraints) {&lt;/p&gt;

&lt;p&gt;var width = constraints.maxWidth;&lt;/p&gt;

&lt;p&gt;var height = constraints.maxHeight;&lt;/p&gt;

&lt;p&gt;var safeWidth = width - 2 * padding;&lt;/p&gt;

&lt;p&gt;var safeHeight = height - 2 * padding;&lt;/p&gt;

&lt;p&gt;var heightOfPrimaryCard = safeHeight;&lt;/p&gt;

&lt;p&gt;var widthOfPrimaryCard = heightOfPrimaryCard * cardAspectRation;&lt;/p&gt;

&lt;p&gt;var primaryCardLeft = safeWidth - widthOfPrimaryCard;&lt;/p&gt;

&lt;p&gt;var horizontalInset = primaryCardLeft / 2;&lt;/p&gt;

&lt;p&gt;List cardList = [];&lt;/p&gt;

&lt;p&gt;for (var i = 0; i &amp;lt; images.length; i++) {&lt;/p&gt;

&lt;p&gt;var delta = i - currentPage;&lt;/p&gt;

&lt;p&gt;bool isOnRight = delta &amp;gt; 0;&lt;/p&gt;

&lt;p&gt;var start = padding +&lt;/p&gt;

&lt;p&gt;max(&lt;/p&gt;

&lt;p&gt;primaryCardLeft -&lt;/p&gt;

&lt;p&gt;horizontalInset * -delta * (isOnRight ? 15 : 1),&lt;/p&gt;

&lt;p&gt;0.0);&lt;/p&gt;

&lt;p&gt;var cardItem = Positioned.directional(&lt;/p&gt;

&lt;p&gt;top: padding + verticalInset * max(-delta, 0.0),&lt;/p&gt;

&lt;p&gt;bottom: padding + verticalInset * max(-delta, 0.0),&lt;/p&gt;

&lt;p&gt;start: start,&lt;/p&gt;

&lt;p&gt;textDirection: TextDirection.rtl,&lt;/p&gt;

&lt;p&gt;child: ClipRRect(&lt;/p&gt;

&lt;p&gt;borderRadius: BorderRadius.circular(16.0),&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;decoration: BoxDecoration(color: Colors.white, boxShadow: [&lt;/p&gt;

&lt;p&gt;BoxShadow(&lt;/p&gt;

&lt;p&gt;color: Colors.black12,&lt;/p&gt;

&lt;p&gt;offset: Offset(3.0, 6.0),&lt;/p&gt;

&lt;p&gt;blurRadius: 10.0)&lt;/p&gt;

&lt;p&gt;]),&lt;/p&gt;

&lt;p&gt;child: AspectRatio(&lt;/p&gt;

&lt;p&gt;aspectRatio: cardAspectRation,&lt;/p&gt;

&lt;p&gt;child: Stack(&lt;/p&gt;

&lt;p&gt;fit: StackFit.expand,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Image.asset(images[i], fit: BoxFit.cover),&lt;/p&gt;

&lt;p&gt;Align(&lt;/p&gt;

&lt;p&gt;alignment: Alignment.bottomLeft,&lt;/p&gt;

&lt;p&gt;child: Column(&lt;/p&gt;

&lt;p&gt;mainAxisSize: MainAxisSize.min,&lt;/p&gt;

&lt;p&gt;crossAxisAlignment: CrossAxisAlignment.start,&lt;/p&gt;

&lt;p&gt;children: [&lt;/p&gt;

&lt;p&gt;Container(&lt;/p&gt;

&lt;p&gt;decoration: BoxDecoration(&lt;/p&gt;

&lt;p&gt;color: Colors.black45,&lt;/p&gt;

&lt;p&gt;borderRadius: BorderRadius.circular(20.0)),&lt;/p&gt;

&lt;p&gt;child: Padding(&lt;/p&gt;

&lt;p&gt;padding: EdgeInsets.symmetric(&lt;/p&gt;

&lt;p&gt;horizontal: 16.0, vertical: 8.0),&lt;/p&gt;

&lt;p&gt;child: Text(title[i],&lt;/p&gt;

&lt;p&gt;style: TextStyle(&lt;/p&gt;

&lt;p&gt;color: Colors.white,&lt;/p&gt;

&lt;p&gt;fontSize: 25.0,&lt;/p&gt;

&lt;p&gt;fontFamily: "SF-Pro-Text-Regular")),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;SizedBox(&lt;/p&gt;

&lt;p&gt;height: 10.0,&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;Padding(&lt;/p&gt;

&lt;p&gt;padding: const EdgeInsets.only(&lt;/p&gt;

&lt;p&gt;left: 12.0, bottom: 12.0),&lt;/p&gt;

&lt;p&gt;child: Container(&lt;/p&gt;

&lt;p&gt;padding: EdgeInsets.symmetric(&lt;/p&gt;

&lt;p&gt;horizontal: 22.0, vertical: 6.0),&lt;/p&gt;

&lt;p&gt;decoration: BoxDecoration(&lt;/p&gt;

&lt;p&gt;color: Colors.blueAccent,&lt;/p&gt;

&lt;p&gt;borderRadius:&lt;/p&gt;

&lt;p&gt;BorderRadius.circular(20.0)),&lt;/p&gt;

&lt;p&gt;child: GestureDetector(&lt;/p&gt;

&lt;p&gt;onTap: () {&lt;/p&gt;

&lt;p&gt;print("FFFFFF");&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;child: Text(&lt;/p&gt;

&lt;p&gt;"Read more..",&lt;/p&gt;

&lt;p&gt;style: TextStyle(color: Colors.white),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;cardList.add(cardItem);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return Stack(&lt;/p&gt;

&lt;p&gt;children: cardList,&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;),&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}`  &lt;/p&gt;

&lt;p&gt;Result&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F0Pzzpho--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02cpcv8t8zcuakrzvhbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F0Pzzpho--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02cpcv8t8zcuakrzvhbb.png" alt="Image description" width="661" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TW43pAXa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2cssrryukjd2vnilbyn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TW43pAXa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2cssrryukjd2vnilbyn3.png" alt="Image description" width="643" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e4oVeSch--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bhcks25qn3c5bgo9ppf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e4oVeSch--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bhcks25qn3c5bgo9ppf.png" alt="Image description" width="655" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pu3Nt2N9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/93g6o8hrc3021d158s7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pu3Nt2N9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/93g6o8hrc3021d158s7l.png" alt="Image description" width="875" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_SFJk22O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/whyw6al0xu1ia5psdpja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_SFJk22O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/whyw6al0xu1ia5psdpja.png" alt="Image description" width="875" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tricks and Tips&lt;br&gt;
Make sure that downloaded plugin is unzipped in parent directory of project.&lt;br&gt;
Makes sure that agconnect-services.json file added.&lt;br&gt;
Make sure dependencies are added yaml file.&lt;br&gt;
Run flutter pug get after adding dependencies.&lt;br&gt;
Make sure that service is enabled in agc.&lt;br&gt;
Makes sure images are defined in yaml file.&lt;br&gt;
Conclusion&lt;br&gt;
In this article, we have learnt how to integrate Account kit, Analytics and Ads kit into Huawei StoryApp for flutter. Once Account kit integrated, users can login quickly and conveniently sign in to apps with their Huawei IDs after granting initial access permission. Analytics helps you to analyze the user behavior and Ads kit helps you to monetize the app.&lt;br&gt;
Thank you so much for reading, I hope this article helps you to understand the integration of Huawei Account kit, Ads kit and Analytics kit in flutter.&lt;br&gt;
Reference&lt;br&gt;
&lt;a href="https://developer.huawei.com/consumer/en/doc/development/HMS-Plugin-Guides/publisher-service-0000001050196431"&gt;Ads Kit&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.huawei.com/consumer/en/doc/development/HMS-Plugin-Guides/introduction-0000001050169136"&gt;Analytics Kit&lt;/a&gt;&lt;br&gt;
Ads Kit — &lt;a href="https://developer.huawei.com/consumer/en/training/course/video/101582989856737152"&gt;Training Video&lt;/a&gt;&lt;br&gt;
Analytics Kit — &lt;a href="https://developer.huawei.com/consumer/en/training/course/video/101582991973534154"&gt;Training Video&lt;/a&gt;&lt;br&gt;
&lt;a href="https://forums.developer.huawei.com/forumPortal/en/topic/0202805600264010194?ha_source=hms1"&gt;Checkout in forum&lt;/a&gt;     &lt;/p&gt;

</description>
      <category>accountkit</category>
      <category>analytics</category>
      <category>adskit</category>
      <category>hmscor</category>
    </item>
    <item>
      <title>Login with Huawei Account Kit Huawei StoryApp [Flutter]</title>
      <dc:creator>siddums</dc:creator>
      <pubDate>Fri, 11 Feb 2022 10:50:38 +0000</pubDate>
      <link>https://forem.com/siddums/login-with-huawei-account-kit-huawei-storyapp-flutter-2a30</link>
      <guid>https://forem.com/siddums/login-with-huawei-account-kit-huawei-storyapp-flutter-2a30</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsdn9emxo2p3ussjpy6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsdn9emxo2p3ussjpy6m.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Introduction&lt;/p&gt;

&lt;p&gt;In this article, we will be integrating Account Kit in Huawei StoryApp. Flutter plugin provides simple and convenient way to experience authorization of users. Flutter Account Plugin allows users to connect to the Huawei ecosystem using their Huawei IDs from the different devices such as mobiles phones and tablets, added users can login quickly and conveniently sign in to apps with their Huawei IDs after granting initial access permission.&lt;/p&gt;

&lt;p&gt;Development Overview&lt;/p&gt;

&lt;p&gt;You need to install Flutter and Dart plugin in IDE and I assume that you have prior knowledge about the Flutter and Dart.&lt;/p&gt;

&lt;p&gt;Hardware Requirements&lt;/p&gt;

&lt;p&gt;A computer (desktop or laptop) running Windows 10.&lt;br&gt;
A Huawei phone (with the USB cable), which is used for debugging.&lt;br&gt;
Software Requirements&lt;/p&gt;

&lt;p&gt;Java JDK 1.7 or later.&lt;br&gt;
 Android studio software or Visual Studio or Code installed.&lt;br&gt;
 HMS Core (APK) 4.X or later.&lt;br&gt;
Integration process&lt;/p&gt;

&lt;p&gt;Step 1: Create flutter project.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ff6p9wai55cj5uehy7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ff6p9wai55cj5uehy7c.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qakyddyh92m1cws11qf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qakyddyh92m1cws11qf.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Step 2: Add the App level gradle dependencies. Choose inside project Android &amp;gt; app &amp;gt; build.gradle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply plugin: 'com.android.application'

apply plugin: 'com.huawei.agconnect'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Root level gradle dependencies&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;maven {url 'https://developer.huawei.com/repo/'}

classpath 'com.huawei.agconnect:agcp:1.5.2.300'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Add the below permissions in Android Manifest file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;

&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&amp;gt;

&amp;lt;uses-permission android:name="com.huawei.appmarket.service.commondata.permission.GET_COMMON_DATA"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Download flutter plugins&lt;/p&gt;

&lt;p&gt;Flutter plugin for Account kit&lt;/p&gt;

&lt;p&gt;Step 5: Add downloaded file into parent directory of the project. Declare plugin path in pubspec.yaml file under dependencies.&lt;/p&gt;

&lt;p&gt;Add path location for asset image.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p7yavv9lemz5x3cn8n3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p7yavv9lemz5x3cn8n3.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshvgqcm0xzoa494vxhjb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshvgqcm0xzoa494vxhjb.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Let's start coding&lt;/p&gt;

&lt;p&gt;loginScreen.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoginScreen extends StatelessWidget {

const LoginScreen({Key? key}) : super(key: key);

@override

Widget build(BuildContext context) {

return MaterialApp(

debugShowCheckedModeBanner: false,

home: LoginDemo(),

);

}

}

class LoginDemo extends StatefulWidget {

@override

_LoginDemoState createState() =&amp;gt; _LoginDemoState();

}

class _LoginDemoState extends State&amp;lt;LoginDemo&amp;gt; {

@override

Widget build(BuildContext context) {

return Scaffold(

backgroundColor: Colors.white,

appBar: AppBar(

title: Text("Login Page"),

backgroundColor: Colors.grey[850],

),

body: SingleChildScrollView(

child: Column(

children: &amp;lt;Widget&amp;gt;[

Padding(

padding: const EdgeInsets.only(top: 60.0),

child: Center(

child: Container(

width: 200,

height: 150,

decoration: BoxDecoration(

color: Colors.red,

borderRadius: BorderRadius.circular(60.0)),

child: Image.asset('images/logo_huawei.png')),

),

),

Padding(

padding: EdgeInsets.symmetric(horizontal: 15),

child: TextField(

decoration: InputDecoration(

border: OutlineInputBorder(),

labelText: 'Email',

hintText: 'Enter valid email id '),

),

),

Padding(

padding: const EdgeInsets.only(

left: 15.0, right: 15.0, top: 15, bottom: 0),

child: TextField(

obscureText: true,

decoration: InputDecoration(

border: OutlineInputBorder(),

labelText: 'Password',

hintText: 'Enter password'),

),

),

FlatButton(

onPressed: () {

//TODO FORGOT PASSWORD SCREEN GOES HERE

},

child: Text(

'Forgot Password',

style: TextStyle(color: Colors.blue, fontSize: 15),

),

),

Container(

height: 50,

width: 250,

decoration: BoxDecoration(

color: Colors.red, borderRadius: BorderRadius.circular(20)),

child: FlatButton(

onPressed: () {

Navigator.push(

context, MaterialPageRoute(builder: (_) =&amp;gt; Main1()));

},

child: Text(

'Login',

style: TextStyle(color: Colors.white, fontSize: 25),

),

),

),

SizedBox(

height: 5,

),

Container(

height: 50,

width: 250,

decoration: BoxDecoration(

color: Colors.red, borderRadius: BorderRadius.circular(20)),

child: FlatButton(

onPressed: () {

signInWithHuaweiAccount();

},

child: Text(

'Login Huawei ID',

style: TextStyle(color: Colors.white, fontSize: 25),

),

),

),

SizedBox(

height: 30,

),

Text('New User? Create Account')

],

),

),

);

}

void signInWithHuaweiAccount() async {

AccountAuthParamsHelper helper = new AccountAuthParamsHelper();

helper.setAuthorizationCode();

try {

// The sign-in is successful, and the user's ID information and authorization code are obtained.

Future&amp;lt;AuthAccount&amp;gt; account = AccountAuthService.signIn(helper);

account.then((value) =&amp;gt; Fluttertoast.showToast(

msg: "Welcome " + value.displayName.toString(),

toastLength: Toast.LENGTH_SHORT,

gravity: ToastGravity.CENTER,

timeInSecForIosWeb: 1,

backgroundColor: Colors.red,

textColor: Colors.white,

fontSize: 16.0));

Navigator.push(context, MaterialPageRoute(builder: (_) =&amp;gt; Main1()));

} on Exception catch (e) {

print(e.toString());

}

}

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Main.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Main1 extends StatefulWidget {

@override

_Main1State createState() =&amp;gt; _Main1State();

}

var cardAspectRation = 12.0 / 20.0;

var widgetAspectRatio = cardAspectRation * 1.2;

var verticalInset = 20.0;

class _Main1State extends State&amp;lt;Main1&amp;gt; {

var currentPage = images.length - 1.0;

@override

void dispose() {

SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);

super.dispose();

}

@override

initState() {

SystemChrome.setEnabledSystemUIOverlays([]);

super.initState();

}

@override

Widget build(BuildContext context) {

PageController controller = PageController(initialPage: images.length - 1);

controller.addListener(() {

setState(() {

currentPage = controller.page!;

});

});

return Scaffold(

backgroundColor: Colors.grey[850],

body: SingleChildScrollView(

child: Column(

children: &amp;lt;Widget&amp;gt;[

Padding(

padding: const EdgeInsets.only(

left: 12.0, right: 12.2, top: 10.0, bottom: 8.0),

child: Row(

mainAxisAlignment: MainAxisAlignment.spaceBetween,

children: &amp;lt;Widget&amp;gt;[

IconButton(

onPressed: () {},

icon: Icon(CustomIcons.menu,

color: Colors.white, size: 30.0),

),

IconButton(

onPressed: () {},

icon: Icon(Icons.search, color: Colors.white, size: 30.0),

)

],

),

),

Padding(

padding: EdgeInsets.symmetric(horizontal: 20.0),

child: Row(

mainAxisAlignment: MainAxisAlignment.spaceBetween,

children: &amp;lt;Widget&amp;gt;[

Text(

"Trending",

style: TextStyle(

color: Colors.white,

fontSize: 40.0,

fontFamily: "Calibre-Semibold",

letterSpacing: 1.0),

),

IconButton(

onPressed: () {},

icon: Icon(

CustomIcons.option,

size: 12.0,

color: Colors.white,

))

],

),

),

Padding(

padding: const EdgeInsets.only(left: 20.0),

child: Row(

children: &amp;lt;Widget&amp;gt;[

Container(

decoration: BoxDecoration(

color: Colors.deepOrangeAccent,

borderRadius: BorderRadius.circular(20.0),

),

child: Center(

child: Padding(

padding: EdgeInsets.symmetric(

horizontal: 22.0, vertical: 6.0),

child: Text(

"Programs",

style: TextStyle(color: Colors.white),

),

),

),

),

SizedBox(

width: 15.0,

),

Text(

"25+ Stories",

style: TextStyle(color: Colors.blueAccent),

)

],

),

),

GestureDetector(

onTap: () {

print("Clicked " + currentPage.toInt().toString());

_launchURL(url[currentPage.toInt()]);

},

child: Stack(

children: &amp;lt;Widget&amp;gt;[

CardScrollWidget(currentPage),

Positioned.fill(

child: PageView.builder(

itemCount: images.length,

controller: controller,

reverse: true,

itemBuilder: (BuildContext context, int index) {

return Container();

},

))

],

),

),

Padding(

padding: EdgeInsets.symmetric(horizontal: 20.0),

child: Row(

mainAxisAlignment: MainAxisAlignment.spaceBetween,

children: &amp;lt;Widget&amp;gt;[

Text(

"Favourite",

style: TextStyle(

color: Colors.white,

fontSize: 40.0,

fontFamily: "Calibre-Semibold",

letterSpacing: 1.0),

),

IconButton(

onPressed: () {},

icon: Icon(

CustomIcons.option,

size: 12.0,

color: Colors.white,

))

],

),

),

Padding(

padding: const EdgeInsets.only(left: 20.0),

child: Row(

children: &amp;lt;Widget&amp;gt;[

Container(

decoration: BoxDecoration(

color: Colors.deepOrangeAccent,

borderRadius: BorderRadius.circular(20.0),

),

child: Center(

child: Padding(

padding: EdgeInsets.symmetric(

horizontal: 22.0, vertical: 6.0),

child: Text(

"Programs",

style: TextStyle(color: Colors.white),

),

),

),

),

SizedBox(

width: 15.0,

),

Text(

"32+ Stories",

style: TextStyle(color: Colors.blueAccent),

)

],

),

)

],

),

));

}

void _launchURL(String url) async {

debugPrint('..... Clicked.....');

if (!await launch(url)) throw 'Could not launch url';

}

}

class CardScrollWidget extends StatelessWidget {

var currentPage;

var padding = 20.0;

CardScrollWidget(this.currentPage);

@override

Widget build(BuildContext context) {

return AspectRatio(

aspectRatio: widgetAspectRatio,

child: LayoutBuilder(

builder: (context, constraints) {

var width = constraints.maxWidth;

var height = constraints.maxHeight;

var safeWidth = width - 2 * padding;

var safeHeight = height - 2 * padding;

var heightOfPrimaryCard = safeHeight;

var widthOfPrimaryCard = heightOfPrimaryCard * cardAspectRation;

var primaryCardLeft = safeWidth - widthOfPrimaryCard;

var horizontalInset = primaryCardLeft / 2;

List&amp;lt;Widget&amp;gt; cardList = [];

for (var i = 0; i &amp;lt; images.length; i++) {

var delta = i - currentPage;

bool isOnRight = delta &amp;gt; 0;

var start = padding +

max(

primaryCardLeft -

horizontalInset * -delta * (isOnRight ? 15 : 1),

0.0);

var cardItem = Positioned.directional(

top: padding + verticalInset * max(-delta, 0.0),

bottom: padding + verticalInset * max(-delta, 0.0),

start: start,

textDirection: TextDirection.rtl,

child: ClipRRect(

borderRadius: BorderRadius.circular(16.0),

child: Container(

decoration: BoxDecoration(color: Colors.white, boxShadow: [

BoxShadow(

color: Colors.black12,

offset: Offset(3.0, 6.0),

blurRadius: 10.0)

]),

child: AspectRatio(

aspectRatio: cardAspectRation,

child: Stack(

fit: StackFit.expand,

children: &amp;lt;Widget&amp;gt;[

Image.asset(images[i], fit: BoxFit.cover),

Align(

alignment: Alignment.bottomLeft,

child: Column(

mainAxisSize: MainAxisSize.min,

crossAxisAlignment: CrossAxisAlignment.start,

children: &amp;lt;Widget&amp;gt;[

Container(

decoration: BoxDecoration(

color: Colors.black45,

borderRadius: BorderRadius.circular(20.0)),

child: Padding(

padding: EdgeInsets.symmetric(

horizontal: 16.0, vertical: 8.0),

child: Text(title[i],

style: TextStyle(

color: Colors.white,

fontSize: 25.0,

fontFamily: "SF-Pro-Text-Regular")),

),

),

SizedBox(

height: 10.0,

),

Padding(

padding: const EdgeInsets.only(

left: 12.0, bottom: 12.0),

child: Container(

padding: EdgeInsets.symmetric(

horizontal: 22.0, vertical: 6.0),

decoration: BoxDecoration(

color: Colors.blueAccent,

borderRadius:

BorderRadius.circular(20.0)),

child: GestureDetector(

onTap: () {

print("FFFFFF");

},

child: Text(

"Read more..",

style: TextStyle(color: Colors.white),

),

),

),

)

],

),

)

],

),

),

),

),

);

cardList.add(cardItem);

}

return Stack(

children: cardList,

);

},

),

);

}

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CustomIcons.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class CustomIcons {

static const IconData menu = IconData(0xe900, fontFamily: "CustomIcons");

static const IconData option = IconData(0xe902, fontFamily: "CustomIcons");

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;data.dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List&amp;lt;String&amp;gt; images = [

"images/image_04.png",

"images/image_03.png",

"images/image_02.png",

"images/image_01.png",

];

List&amp;lt;String&amp;gt; title = [

"HUAWEI Women Developers",

"Huawei Developer Experts",

"Huawei Student Developers",

"Huawei Developer Group",

];

List&amp;lt;String&amp;gt; url = [

"https://developer.huawei.com/consumer/en/programs/hwd",

"https://developer.huawei.com/consumer/en/programs/hsd/",

"https://developer.huawei.com/consumer/en/programs/hde",

"https://developer.huawei.com/consumer/en/programs/hdg/",

];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0jq5g1ozvg6xq6hcusj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0jq5g1ozvg6xq6hcusj.gif" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Tricks and Tips&lt;/p&gt;

&lt;p&gt;Make sure that downloaded plugin is unzipped in parent directory of project.&lt;br&gt;
Makes sure that agconnect-services.json file added.&lt;br&gt;
Make sure dependencies are added yaml file.&lt;br&gt;
Run flutter pug get after adding dependencies.&lt;br&gt;
Make sure that service is enabled in agc.&lt;br&gt;
Makes sure images are defined in yaml file.&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;In this article, we have learnt how to integrate Account Kit into Huawei StoryApp for flutter. Once Account kit integrated, users can login quickly and conveniently sign in to apps with their Huawei IDs after granting initial access permission.&lt;/p&gt;

&lt;p&gt;Thank you so much for reading, I hope this article helps you to understand the Huawei Account kit in flutter.&lt;/p&gt;

&lt;p&gt;Reference&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/HMS-Plugin-Guides-V1/introduction-0000001050766441-V1" rel="noopener noreferrer"&gt;Account Kit&lt;/a&gt;&lt;br&gt;
&lt;a href="https://forums.developer.huawei.com/forumPortal/en/topic/0202799554814350174?ha_source=hms1" rel="noopener noreferrer"&gt;Checkout in forum&lt;/a&gt;&lt;/p&gt;

</description>
      <category>huaweiaccountkit</category>
      <category>hmscore</category>
      <category>huaweideveloper</category>
      <category>appgaller</category>
    </item>
    <item>
      <title>Integrating Huawei Map kit in HarmonyOs Wearable Device Application</title>
      <dc:creator>siddums</dc:creator>
      <pubDate>Fri, 04 Feb 2022 09:28:17 +0000</pubDate>
      <link>https://forem.com/siddums/integrating-huawei-map-kit-in-harmonyos-wearable-device-application-24mn</link>
      <guid>https://forem.com/siddums/integrating-huawei-map-kit-in-harmonyos-wearable-device-application-24mn</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iXKj0-VX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i5gh5ub8oqz5i80dkgnr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iXKj0-VX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i5gh5ub8oqz5i80dkgnr.jpg" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;br&gt;
Introduction&lt;/p&gt;

&lt;p&gt;In this article, we will learn about Huawei Map Kit in HarmonyOs. Map Kit is an SDK for map development. It covers map data of more than 200 countries and regions, and supports over 70 languages. With this SDK, you can easily integrate map-based functions into your HarmonyOs application.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3zhs2m-h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mt3mpjc9ogsnam4aeas7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3zhs2m-h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mt3mpjc9ogsnam4aeas7.png" alt="Image description" width="880" height="159"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1S-1XEnQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ydr9f931btse3kvbhnzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1S-1XEnQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ydr9f931btse3kvbhnzd.png" alt="Image description" width="880" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Development Overview&lt;/p&gt;

&lt;p&gt;You need to install DevEcho Studio IDE and I assume that you have prior knowledge about the Harmony Os and java.&lt;/p&gt;

&lt;p&gt;Hardware Requirements&lt;/p&gt;

&lt;p&gt;A computer (desktop or laptop) running windows 10.&lt;br&gt;
A HarmonyOs Smart Watch (with the USB cable), which is used for debugging.&lt;br&gt;
Software Requirements&lt;/p&gt;

&lt;p&gt;Java JDK installation package.&lt;br&gt;
DevEcho Studio installed.&lt;br&gt;
Steps:&lt;/p&gt;

&lt;p&gt;Step 1: Create a HarmonyOs Application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jqc7_v7I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dak3cyj8jsw0ixexc5wk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jqc7_v7I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dak3cyj8jsw0ixexc5wk.png" alt="Image description" width="880" height="538"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kacPZEzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ut7e6ddluubhvwti1tpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kacPZEzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ut7e6ddluubhvwti1tpd.png" alt="Image description" width="880" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Create a project in &lt;a href="https://developer.huawei.com/consumer/en/codelab/HMSPreparation/index.html#0"&gt;AppGallery&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: &lt;a href="https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/harmonyos-config-agc-0000001153340474"&gt;Configure App &lt;/a&gt;in AppGallery&lt;/p&gt;

&lt;p&gt;Step 3: Follow the SDK &lt;a href="https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/harmonyos-sdk-integrating-sdk-0000001101419182"&gt;integration steps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's start coding&lt;/p&gt;

&lt;p&gt;MapAbilitySlice.java&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MapAbilitySlice extends AbilitySlice {

private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "TAG");

private MapView mMapView;

@Override

public void onStart(Intent intent) {

super.onStart(intent);

CommonContext.setContext(this);

// Declaring and Initializing the HuaweiMapOptions Object

HuaweiMapOptions huaweiMapOptions = new HuaweiMapOptions();

// Initialize Camera Properties

CameraPosition cameraPosition =

new CameraPosition(new LatLng(12.972442, 77.580643), 10, 0, 0);

huaweiMapOptions

// Set Camera Properties

.camera(cameraPosition)

// Enables or disables the zoom function. By default, the zoom function is enabled.

.zoomControlsEnabled(false)

// Sets whether the compass is available. The compass is available by default.

.compassEnabled(true)

// Specifies whether the zoom gesture is available. By default, the zoom gesture is available.

.zoomGesturesEnabled(true)

// Specifies whether to enable the scrolling gesture. By default, the scrolling gesture is enabled.

.scrollGesturesEnabled(true)

// Specifies whether the rotation gesture is available. By default, the rotation gesture is available.

.rotateGesturesEnabled(false)

// Specifies whether the tilt gesture is available. By default, the tilt gesture is available.

.tiltGesturesEnabled(true)

// Sets whether the map is in lite mode. The default value is No.

.liteMode(false)

// Set Preference Minimum Zoom Level

.minZoomPreference(3)

// Set Preference Maximum Zoom Level

.maxZoomPreference(13);

// Initialize the MapView object.

mMapView = new MapView(this,huaweiMapOptions);

// Create the MapView object.

mMapView.onCreate();

// Obtains the HuaweiMap object.

mMapView.getMapAsync(new OnMapReadyCallback() {

@Override

public void onMapReady(HuaweiMap huaweiMap) {

HuaweiMap mHuaweiMap = huaweiMap;

mHuaweiMap.setOnMapClickListener(new OnMapClickListener() {

@Override

public void onMapClick(LatLng latLng) {

new ToastDialog(CommonContext.getContext()).setText("onMapClick ").show();

}

});

// Initialize the Circle object.

Circle mCircle = new Circle(this);

if (null == mHuaweiMap) {

return;

}

if (null != mCircle) {

mCircle.remove();

mCircle = null;

}

mCircle = mHuaweiMap.addCircle(new CircleOptions()

.center(new LatLng(12.972442, 77.580643))

.radius(500)

.fillColor(Color.GREEN.getValue()));

new ToastDialog(CommonContext.getContext()).setText("color green: " + Color.GREEN.getValue()).show();

int strokeColor = Color.RED.getValue();

float strokeWidth = 15.0f;

// Set the edge color of a circle

mCircle.setStrokeColor(strokeColor);

// Sets the edge width of a circle

mCircle.setStrokeWidth(strokeWidth);

}

});

// Create a layout.

ComponentContainer.LayoutConfig config = new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_PARENT);

PositionLayout myLayout = new PositionLayout(this);

myLayout.setLayoutConfig(config);

ShapeElement element = new ShapeElement();

element.setShape(ShapeElement.RECTANGLE);

element.setRgbColor(new RgbColor(255, 255, 255));

myLayout.addComponent(mMapView);

super.setUIContent(myLayout);

}

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ct8f697S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u0fk7fdqc5vgt2wnmliz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ct8f697S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u0fk7fdqc5vgt2wnmliz.png" alt="Image description" width="414" height="517"&gt;&lt;/a&gt;&lt;br&gt;
Tips and Tricks&lt;/p&gt;

&lt;p&gt;Add required dependencies without fail.&lt;br&gt;
Add required images in resources &amp;gt; base &amp;gt; media.&lt;br&gt;
Add custom strings in resources &amp;gt; base &amp;gt; element &amp;gt; string.json.&lt;br&gt;
Define supporting devices in config.json file.&lt;br&gt;
Do not log the sensitive data.&lt;br&gt;
Enable required service in AppGallery Connect.&lt;br&gt;
Use respective Log methods to print logs.&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;In this article, we have learnt, integration of Huawei Map in HarmonyOs wearable device using Huawei Map Kit. Sample application shows how to implement Map kit in HarmonyOs Wearables device. Hope this articles helps you to understand and integration of map kit, you can use this feature in your HarmonyOs application to display map in wearable devices.&lt;/p&gt;

&lt;p&gt;Thank you so much for reading this article and I hope this article helps you to understand Huawei Map Kit in HarmonyOS. Please provide your comments in the comment section and like.&lt;/p&gt;

&lt;p&gt;References&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/harmonyos-sdk-introduction-0000001147819099"&gt;Map Kit&lt;/a&gt;&lt;br&gt;
&lt;a href="https://forums.developer.huawei.com/forumPortal/en/topic/0201793437026930167?ha_source=hms1"&gt;Checkout in forum &lt;/a&gt;&lt;/p&gt;

</description>
      <category>harmonyos</category>
      <category>map</category>
      <category>huaweidevelopers</category>
      <category>appgallery</category>
    </item>
  </channel>
</rss>
