<?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>DEV Community: Shalini Kumari</title>
    <description>The latest articles on DEV Community by Shalini Kumari (@shalinikumari50).</description>
    <link>https://dev.to/shalinikumari50</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%2F440215%2F4e34d05c-d983-488f-92ab-c6cacfe504dc.png</url>
      <title>DEV Community: Shalini Kumari</title>
      <link>https://dev.to/shalinikumari50</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shalinikumari50"/>
    <language>en</language>
    <item>
      <title>Use flutter at its BEST!</title>
      <dc:creator>Shalini Kumari</dc:creator>
      <pubDate>Mon, 21 Mar 2022 18:21:03 +0000</pubDate>
      <link>https://dev.to/shalinikumari50/use-flutter-at-its-best-6cm</link>
      <guid>https://dev.to/shalinikumari50/use-flutter-at-its-best-6cm</guid>
      <description>&lt;p&gt;Flutter can help you build your next big idea 😀 and it has a lot of widgets and libraries to facilitate the development. But you can use them only when you know about them 😎 so do you know any of these that can help increase your productivity? &lt;/p&gt;

&lt;h2&gt;
  
  
  1.) Introduction Screen
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/introduction_screen"&gt;Introduction screen&lt;/a&gt; allows you to have a screen at launcher for example, where you can explain your app. This Widget is very customizable with a great design.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IntroductionScreen(
  pages: listPagesViewModel,
  onDone: () {
    // When done button is press
  },
  showBackButton: false,
  showSkipButton: true,
  skip: const Text("Skip"),
  done: const Text("Done", style: TextStyle(
            fontWeight: FontWeight.w600
        )),
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2.) RichText
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://api.flutter.dev/flutter/widgets/RichText-class.html"&gt;RichText&lt;/a&gt; widget displays text that uses multiple different styles. The text to display is described using a tree of TextSpan objects, each of which has an associated style that is used for that subtree.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RichText(
  text: TextSpan(
    text: 'Hello ',
    style: DefaultTextStyle.of(context).style,
    children: const &amp;lt;TextSpan&amp;gt;[
      TextSpan(text: 'bold', style: TextStyle(
                  fontWeight: FontWeight.bold
      )),
      TextSpan(text: ' world!'),
    ],
  ),
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3.) CircleAvatar
&lt;/h2&gt;

&lt;p&gt;Show the user avatar inside a circle in your user's profile 🤗&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CircleAvatar(
  radius: 150,
  child: Image.asset("images/welcome.png"),
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.) Splash Screen
&lt;/h2&gt;

&lt;p&gt;Splash screens provide a simple initial experience while your mobile app loads.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HpROzb3K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/58vtjd5d1cttkkvzomjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HpROzb3K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/58vtjd5d1cttkkvzomjl.png" alt="Image description" width="880" height="364"&gt;&lt;/a&gt;&lt;br&gt;
Add this to your pubspec.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter_native_splash:
  color: "#42a5f5"
  image: assets/splash.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this command in terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter pub run flutter_native_splash:create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5.) Status Bar and Navigation Bar
&lt;/h2&gt;

&lt;p&gt;Customize the status and navigation bar!!! Add your favourite colors 🎨&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SystemChrome.setSystemUIOverlayStyle(
    SystemUioverlayStyle(
      statusBarColor: Colors.indigoAccent,
      systemNavigationBarColor: Colors.indigoAccent,
    )
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6.) Cupertino Widgets
&lt;/h2&gt;

&lt;p&gt;You can set the components according to the platform, if you want you screens to be more like iOS, you can use cupertino.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Platform.isAndroid
  ? CircularProgressIndicator()
  : CupertinoActivityIndicator()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7.) Slider
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://api.flutter.dev/flutter/material/Slider-class.html"&gt;slider&lt;/a&gt; in Flutter is a material design widget used for selecting a range of values.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Slider(
  value: currentValue,
  onChanged: (newValue) {
    setState( () {
      currentValue = newValue;
    });
 },
 min: 0,
 max: 100,
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8.) Chips
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://api.flutter.dev/flutter/material/Chip-class.html"&gt;Chips&lt;/a&gt; are compact elements that represent an attribute, text, entity, or action.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--crVWkvHI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bj4iee5riyon5i297j5w.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--crVWkvHI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bj4iee5riyon5i297j5w.jpeg" alt="Image description" width="300" height="194"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Chip(
 label: Text(languages(index)),
 onSelected: (bool value) {},
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9.) Use Google Fonts
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SelectableText(
  "Google Fonts",
  style: GoogleFonts.aguafinaScript().copyWith(fontSize: 60),
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10.) Curved Navigation Bar
&lt;/h2&gt;

&lt;p&gt;Who wants a cool &lt;a href="https://pub.dev/packages/curved_navigation_bar"&gt;navigation bar&lt;/a&gt; 🤩?&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CurvedNavigationBar(
  backgroundColor: Colors.blueAccent,
  items: _icons,
  onTap: (index) {},
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❤ ❤ Thank you for reading this article ❤❤&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Send progress reports as bulk Slack DM’s using Google Sheets + Script</title>
      <dc:creator>Shalini Kumari</dc:creator>
      <pubDate>Fri, 14 May 2021 14:38:09 +0000</pubDate>
      <link>https://dev.to/shalinikumari50/send-progress-reports-as-bulk-slack-dm-s-using-google-sheets-script-44i1</link>
      <guid>https://dev.to/shalinikumari50/send-progress-reports-as-bulk-slack-dm-s-using-google-sheets-script-44i1</guid>
      <description>&lt;p&gt;&lt;strong&gt;First things first, why I built this&lt;/strong&gt;&lt;br&gt;
I was chosen as the Google CloudReady Facilitator for my campus and it was one of the best things that happened in my developer journey. The Google CloudReady Facilitator program added unexpected value to my overall growth. I interacted with hundreds of students, shared my knowledge, and became much better at management skills. &lt;/p&gt;

&lt;p&gt;The journey started with setting up the community. I created a slack workspace and invited all the students to it. After the enrollment period ended, next thing was to interact with students, help them with their quests completions and send them their daily progress reports.&lt;/p&gt;

&lt;p&gt;Coming to the daily progress reports, initially, I thought about sending emails, as it was pretty easy to automate the emails using zapier. The only thing was that it had a limit of free tasks. After the free tier ended, I realized that we needed some other solution.&lt;/p&gt;

&lt;p&gt;One of the institutions developed a web app where students could enter their email id or qwiklabs profile URL to get their progress reports. It was an amazing app but I wanted to have a different solution. My concern was that procrastination is a real thing and we all do it. We sometimes need a constant reminder or motivation to do things. Therefore, I thought of using the slack API to send personalized daily progress reports to students in their DMs to constantly motivate them to complete their learning.&lt;/p&gt;

&lt;p&gt;My plan was to send bulk DMs to all the students and I also needed to take the quests and skill badge completions as input from the google sheets I had. I used the Google Apps Script to write the script that would call the slack API and send the data from the google sheets to slack.&lt;/p&gt;

&lt;p&gt;On the basis of the email ID of the students, I fetched their slack user id using the users.lookupByEmail method. Then I used the user id to send the DM. There was one more issue that some students were not on slack and it was necessary to filter them out. I colored the row with the email id that was not present on slack and then filtered the rows on the basis of color. It made my life a lot easier and students also got their progress reports directly on their slack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The detailed process of creating the slack app is documented below&lt;/strong&gt;&lt;br&gt;
Go to &lt;a href="https://api.slack.com/apps" rel="noopener noreferrer"&gt;https://api.slack.com/apps&lt;/a&gt; and hit Create New App on the top right. Choose the Create an app from scratch option. Give it a name and pick a workspace where you can create a channel to test your bot. You will need a channel so create a private channel #test.&lt;/p&gt;

&lt;p&gt;Click on Incoming Webhooks under the Features section. Turn on incoming webhooks during setup using the On/Off toggle. Tap on “Add New Webhook to Workspace”.  Choose a channel, the #test channel that we created, where the App can post. You can use this channel for testing. Click Allow.&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%2Fgnk1wdq3i45uytsipju6.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%2Fgnk1wdq3i45uytsipju6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Tap on “OAuth &amp;amp; Permissions” and then on “Add an OAuth Scope” under “User Token Scopes”.  Select “chat:write”.&lt;br&gt;
You might see a notification to reinstall your app. Click on it and then choose a channel. Click Allow.&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%2F1u4u6ivl7vexvvo2elgl.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%2F1u4u6ivl7vexvvo2elgl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You would see an OAuth Access token. Copy it as we will need it later. Make sure to copy the one that starts with "xoxp".&lt;/p&gt;

&lt;p&gt;Now, we will head to google sheets.  Create a new google sheet. Rename Sheet1 to Input.&lt;/p&gt;

&lt;p&gt;Here is what my sheet looked like:&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%2F2fprkkza7brnhup2fwr4.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%2F2fprkkza7brnhup2fwr4.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
From the menu select Tools &amp;gt; Script editor. This will create a Google script. Paste the code from &lt;a href="https://github.com/shalinikumari50/Progress-Report-Slack-App/blob/main/Code.gs" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;You will need to paste the slack API token that you copied earlier in place of 'YOUR_USER_OAUTH_TOKEN'. &lt;br&gt;
You can specify the test that you want to send in place of 'SLACK_MESSAGE_GOES_HERE'.&lt;/p&gt;

&lt;p&gt;I wanted to send two progress metrics so I put them in COL_A and COL_B. You might need to change the indexes of the data.&lt;/p&gt;

&lt;p&gt;Click on “Run” to Authorize it. You will need to click through a series of screens to Authorize your app. You may even be told it is potentially unsafe, but you may proceed because it’s your app.&lt;/p&gt;

&lt;p&gt;Back on the Google Sheet, you will now see Message Menu in the toolbar. Click on it and then hit the Send to Recipients button. You may need to authorize the sheet for the first time.&lt;/p&gt;

&lt;p&gt;Initially, you can test it with your slack email. You will receive a DM from yourself and then you can go ahead with sending Bulk DMs.&lt;/p&gt;

&lt;p&gt;This Slack App helped me avoid sending emails and have more interaction with students. It was a great addition to my learning too. Automation always helps!!!&lt;/p&gt;

</description>
      <category>slackapp</category>
      <category>googlescript</category>
      <category>bot</category>
    </item>
  </channel>
</rss>
