<?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: InstaCodeBlog</title>
    <description>The latest articles on DEV Community by InstaCodeBlog (@instacodeblog).</description>
    <link>https://dev.to/instacodeblog</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%2F553249%2F393163cc-d698-49ee-b82f-6315b5af9fa4.jpg</url>
      <title>DEV Community: InstaCodeBlog</title>
      <link>https://dev.to/instacodeblog</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/instacodeblog"/>
    <language>en</language>
    <item>
      <title>Custom Dialog with Flutter – Step by Step Guide</title>
      <dc:creator>InstaCodeBlog</dc:creator>
      <pubDate>Sun, 03 Jan 2021 14:43:55 +0000</pubDate>
      <link>https://dev.to/instacodeblog/custom-dialog-with-flutter-step-by-step-guide-3g1h</link>
      <guid>https://dev.to/instacodeblog/custom-dialog-with-flutter-step-by-step-guide-3g1h</guid>
      <description>&lt;p&gt;&lt;a href="https://flutter.dev/"&gt;Flutter framework&lt;/a&gt; provides an incredibly easy way to make UI components. But you have to through a lot of experimental processes to get the design or layout of your choice. In this tutorial, we will break down and see step by step to the process for &lt;strong&gt;Custom Dialog Creation with Flutter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the mobile apps, we use Dialog everywhere from alerting some situation to the user to get some feedback from the user.&lt;/p&gt;

&lt;p&gt;Recently I was working on developing a quiz app as mentioned in the article &lt;a href="https://instacodeblog.com/applifecyclestate-management-implementation-in-flutter/"&gt;“AppLifeCycleState Management Implementation In Flutter”&lt;/a&gt;. In this quiz app, I had to display prizes won by user and various other &lt;strong&gt;AlertDialog&lt;/strong&gt; to the user. Using the default dialogs made the game look boring and I had to customize the dialog to make gameplay look fun.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Simple Alert Dialog
&lt;/h2&gt;

&lt;p&gt;We will start by looking into the code for implementing a usual Alert Dialog in Flutter. This will give an idea for us to customize it later. Also, we will see how plain it looks.&lt;/p&gt;

&lt;p&gt;Adding simple Dialog to your screen in pretty easy in Flutter.&lt;/p&gt;

&lt;p&gt;Before adding Dialog you must call  &lt;strong&gt;showDialog&lt;/strong&gt;  function to change current screen state to show the intermediate  &lt;strong&gt;Dialog&lt;/strong&gt;  popup.&lt;/p&gt;

&lt;p&gt;In here we use  &lt;strong&gt;AlertDialog&lt;/strong&gt;  widget to show simple  &lt;strong&gt;Dialog&lt;/strong&gt;  with title and some text in the body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showDialog(
        context: context,
    builder: (BuildContext context){
            return AlertDialog(
                title: Text("Alert Dialog"),
            content: Text("Dialog Content"),
        );
     }
)

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

&lt;/div&gt;



&lt;p&gt;In the content or title section of the AlertDialog, you can add widget of your choice. It is not only limited to text.&lt;/p&gt;

&lt;p&gt;In the AlertDialog widget, there is a parameter called &lt;strong&gt;action&lt;/strong&gt;. It accepts arrays of widgets and you can provide multiple buttons to that. Those Buttons will appear in the bottom right corner of the dialog.&lt;/p&gt;

&lt;p&gt;Here is complete code on implementing &lt;strong&gt;AlertDialog&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showDialog(
        context: context,
    builder: (BuildContext context){
            return AlertDialog(
                title: Text("Alert Dialog"),
            content: Text("Dialog Content"),
                        actions:[
                    FlatButton(
                        child: Text("Close"),
                        onPressed: (){
                                Navigator.of(context).pop();
                    },
                ),
            ],
        );
     }
)

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating Custom Dialog
&lt;/h2&gt;

&lt;p&gt;Let us start creating our custom Dialog in flutter with a &lt;strong&gt;Dialog&lt;/strong&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dialog(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(Consts.padding),
      ),
      elevation: 0.0,
      backgroundColor: Colors.transparent,
      child: dialogContent(context),
    );

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

&lt;/div&gt;



&lt;p&gt;Here we will have a Dialog with a &lt;strong&gt;Round rectangular borde&lt;/strong&gt; r. If you look closely you can see we have created a method called &lt;strong&gt;dialogContent()&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We are setting all the attributes of dialog and heading to dialogContent() which contains all our important widgets. We will use the &lt;strong&gt;Stack Method&lt;/strong&gt; to design our custom Dialog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You may note that in the Stack method the last element will move to the top.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dialogContent(BuildContext context) {
    return Stack(
      children: &amp;lt;Widget&amp;gt;[
        //...bottom card part,
        //...top circlular image part,
        Container(
          padding: EdgeInsets.only(
            top: 200,
            bottom: 16.0,
            left: 16.0,
            right: 16.0,
          ),
          margin: EdgeInsets.only(top: 66.0),
          decoration: new BoxDecoration(
            color: Colors.black, //Colors.black.withOpacity(0.3),
            shape: BoxShape.rectangle,
            borderRadius: BorderRadius.circular(16.0),
            boxShadow: [
              BoxShadow(
                color: Colors.black26,
                blurRadius: 10.0,
                offset: const Offset(0.0, 10.0),
              ),
            ],
          ),
          child: Column(
            mainAxisSize: MainAxisSize.min, // To make the card compact
            children: &amp;lt;Widget&amp;gt;[
              Text(
                title,
                style: TextStyle(
                  fontSize: 24.0,
                  fontWeight: FontWeight.w700,
                  color: Colors.white,
                ),
              ),
              SizedBox(height: 16.0),
              Text(
                description,
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 16.0,
                  color: Colors.white70,
                ),
              ),
              SizedBox(height: 24.0),
              Align(
                alignment: Alignment.bottomRight,
                child: FlatButton(
                  color: Colors.amber,
                  onPressed: () {
                    Navigator.of(context).pop(); // To close the dialog
                  },
                  child: Text(
                    buttonText,
                    style: TextStyle(
                      color: Colors.purple,
                    ),
                  ),
                ),
              ),
    // Implement Circular Image here
            ],
          ),
        ),
      ],
    );
  }

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

&lt;/div&gt;



&lt;p&gt;So we have designed our text portion of the dialog. Here we will use the &lt;strong&gt;Positioned&lt;/strong&gt; widget as a child in Stack to wrap the CircularAvatar as suggested by the flutter dev team.&lt;/p&gt;

&lt;p&gt;Next, you need to put the &lt;strong&gt;CircleAvatar&lt;/strong&gt; to the top of dialog. You need to use CircleAvatar as the child of Position method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Positioned(
    left: 16.0,
    right: 16.0,
    child: CircleAvatar(
        backgroundColor: Colors.amber,
        radius: 150,
        backgroundImage: NetworkImage(
            '&amp;lt;https://media.giphy.com/media/J5kPUb8fe5W95DDAIv/giphy.gif&amp;gt;',
          ),
    ),
),

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete Code for Custom Dialog
&lt;/h2&gt;

&lt;p&gt;So here is how your final code for the &lt;strong&gt;CustomDialog&lt;/strong&gt; class will look. Also you can note here, that I have created a separate file to implement it. This would declutter my main code and would look clean.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';

class CustomDialog extends StatelessWidget {
  final String title, description, buttonText;
  final Image image;

  CustomDialog({
    @required this.title,
    @required this.description,
    @required this.buttonText,
    this.image,
  });

  @override
  Widget build(BuildContext context) {
    return Dialog(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(16.0),
      ),
      elevation: 0.0,
      backgroundColor: Colors.transparent,
      child: dialogContent(context),
    );
  }

  dialogContent(BuildContext context) {
    return Stack(
      children: &amp;lt;Widget&amp;gt;[
        Container(
          padding: EdgeInsets.only(
            top: 66.0 + 16.0 * 12,
            bottom: 16.0,
            left: 16.0,
            right: 16.0,
          ),
          margin: EdgeInsets.only(top: 66.0),
          decoration: new BoxDecoration(
            color: Colors.black, //Colors.black.withOpacity(0.3),
            shape: BoxShape.rectangle,
            borderRadius: BorderRadius.circular(16.0),
            boxShadow: [
              BoxShadow(
                color: Colors.black26,
                blurRadius: 10.0,
                offset: const Offset(0.0, 10.0),
              ),
            ],
          ),
          child: Column(
            mainAxisSize: MainAxisSize.min, // To make the card compact
            children: &amp;lt;Widget&amp;gt;[
              Text(
                title,
                style: TextStyle(
                  fontSize: 24.0,
                  fontWeight: FontWeight.w700,
                  color: Colors.white,
                ),
              ),
              SizedBox(height: 16.0),
              Text(
                description,
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 16.0,
                  color: Colors.white70,
                ),
              ),
              SizedBox(height: 24.0),
              Align(
                alignment: Alignment.bottomRight,
                child: FlatButton(
                  color: Colors.amber,
                  onPressed: () {
                    Navigator.of(context).pop(); // To close the dialog
                  },
                  child: Text(
                    buttonText,
                    style: TextStyle(
                      color: Colors.purple,
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
        Positioned(
          left: 16.0,
          right: 16.0,
          child: CircleAvatar(
            backgroundColor: Colors.amber,
            radius: 150,
            backgroundImage: NetworkImage(
              '&amp;lt;https://upload.wikimedia.org/wikipedia/commons/1/1d/Rotating_Konarka_chaka.gif&amp;gt;',
            ),
          ),
        ),
      ],
    );
  }
}

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

&lt;/div&gt;



&lt;p&gt;We are done with the design. So in our &lt;strong&gt;main.dart&lt;/strong&gt; file I will be calling the above method.&lt;/p&gt;

&lt;p&gt;Here is how my main.dart file looks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'custom_dialog.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() =&amp;gt; _MyHomePageState();
}

class _MyHomePageState extends State&amp;lt;MyHomePage&amp;gt; {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Dialog'),
      ),
      body: Container(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          showDialog(
            barrierDismissible: false,
            context: context,
            builder: (BuildContext context) =&amp;gt; CustomDialog(
              title: "Well Done",
              description:
                  "You have sucessfully implemented Custom Dialog with flutter. \\n You have also learned theory behind and how to customize it further.",
              buttonText: "Close",
            ),
          );
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

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

&lt;/div&gt;



&lt;p&gt;In main file we are using the &lt;strong&gt;floatingActionButton&lt;/strong&gt; of default Flutter project code.&lt;/p&gt;

&lt;p&gt;The result of above code is as shown below:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ECBvPm45--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://instacodeblog.com/wp-content/uploads/2021/01/135817700_803196630229129_4867436469566406314_n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ECBvPm45--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://instacodeblog.com/wp-content/uploads/2021/01/135817700_803196630229129_4867436469566406314_n.jpg" alt="Custom Dialog Creation with Flutter"&gt;&lt;/a&gt;Custom Dialog Creation with Flutter&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I hope you get a better idea about how to implement AlertDialog and How to convert that to a more customized version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you found a better way to implement Custom Dialog? Did you face any issues? Let me know in the comments section.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can check my other &lt;a href="https://instacodeblog.com/category/flutter"&gt;Flutter Tutorials Here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://instacodeblog.com/custom-dialog-with-flutter-step-by-step-guide/"&gt;Custom Dialog with Flutter – Step by Step Guide&lt;/a&gt; appeared first on &lt;a href="https://instacodeblog.com"&gt;InstaCodeBlog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>alertdialog</category>
      <category>showdialog</category>
    </item>
    <item>
      <title>AppLifeCycleState Management Implementation in Flutter</title>
      <dc:creator>InstaCodeBlog</dc:creator>
      <pubDate>Wed, 30 Dec 2020 08:17:50 +0000</pubDate>
      <link>https://dev.to/instacodeblog/applifecyclestate-management-implementation-in-flutter-5g67</link>
      <guid>https://dev.to/instacodeblog/applifecyclestate-management-implementation-in-flutter-5g67</guid>
      <description>&lt;p&gt;As a mobile app developer, you will be required to use AppLifeCycleState at some point. With the usage of Flutter, I could not find many useful articles online regarding &lt;strong&gt;AppLifeCycleState management in Flutter&lt;/strong&gt;. So I thought why not write an article about it.&lt;/p&gt;

&lt;p&gt;Just before the thought came for me to write this article, I was developing an app called &lt;strong&gt;Jinda – Bhutan Quiz App&lt;/strong&gt;. Which should have been published by the time you are reading this article. In my app, I had implement music in the app game-play. When I send the app to background the music was still playing, even when I lock my phone.&lt;/p&gt;

&lt;p&gt;Here is the tutorial!!&lt;/p&gt;

&lt;h2&gt;
  
  
  AppLifeCycleState Management
&lt;/h2&gt;

&lt;p&gt;Your mobile app can be in the various state during its usage. This state is known as the app life cycle state. We can trigger different method as per the state that your app is in.&lt;/p&gt;

&lt;p&gt;These state notifications are sent by your device’s operating system. But you cannot expect always to receive notifications. In some rare circumstances, it does not receive these state notifications. For instance, if the user removed the battery from the device then you will not be receiving any notifications. I assume this will be the rare case as now most smartphones come with a non-removable battery.&lt;/p&gt;

&lt;p&gt;According to official &lt;a href="https://api.flutter.dev/flutter/dart-ui/AppLifecycleState-class.html"&gt;Flutter Documentation&lt;/a&gt;, there are FIVE different constants mentioned. Let us understand it one by one:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;detached&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In this state the application is still hosted on a flutter engine but is detached from any host views.&lt;/p&gt;

&lt;p&gt;This means that the engine is running without a view. It can either be in the progress of attaching a view when the engine was first initialized, or after the view being destroyed due to a Navigator pop method.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;inactive&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The application is in an inactive state and is not receiving user input.&lt;/p&gt;

&lt;p&gt;This state corresponds to an app or the Flutter host view running in the foreground inactive state. Apps transition to this state when in a phone call, responding to a TouchID request, when entering the app switcher or the control centre, or when the UIViewController hosting the Flutter app is transitioning for iOS devices. On Android, this corresponds to an app or the Flutter host view running in the foreground inactive state. Apps transition to this state when another activity is focused, such as a split-screen app, a phone call, a picture-in-picture app, a system dialogue, or another window. Apps in this state should assume that they may be paused at any time.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;paused&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;During paused state the application is not currently visible to the user, not responding to user input, and running in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;resumed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The application is visible and responding to user input.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;values&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A constant List of the values in this enum, in order of their declaration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flutter WidgetsBindingObserver Class
&lt;/h2&gt;

&lt;p&gt;WidgetsBindingObserver is the interface for classes that register with the Widgets layer binding.&lt;/p&gt;

&lt;p&gt;This class can be extended directly, to get default behaviours for all of the handlers, or can be used with the implements keyword, in which case all the handlers must be implemented (and the analyzer will list those that have been omitted).&lt;/p&gt;

&lt;p&gt;You will be using following two method from this class:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;WidgetsBinding.addObserver&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Registers the given object as a binding observer. Binding observers are notified when various application events occur, for example when the system locale changes. Generally, one widget in the widget tree registers itself as a binding observer and converts the system state into inherited widgets.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;WidgetsBinding.removeObserver&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Un-registers the given observer. This should be used sparingly as it is relatively expensive (O(N) in the number of registered observers).&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding AppLifeCycleState to Flutter Code
&lt;/h2&gt;

&lt;p&gt;Enough of theory lets see how we can implement it in our code.&lt;/p&gt;

&lt;p&gt;First You need to extend your class with the WidgetsBindingObserver.&lt;/p&gt;

&lt;p&gt;Secondly, you need to add the method &lt;strong&gt;&lt;a href="https://api.flutter.dev/flutter/widgets/WidgetsBinding/addObserver.html"&gt;addObserver&lt;/a&gt;&lt;/strong&gt; to &lt;strong&gt;initState&lt;/strong&gt; and also add &lt;strong&gt;&lt;a href="https://api.flutter.dev/flutter/widgets/WidgetsBinding/removeObserver.html"&gt;removeObserver&lt;/a&gt;&lt;/strong&gt; to &lt;strong&gt;dispose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Finally, we will implement function &lt;strong&gt;&lt;a href="https://api.flutter.dev/flutter/widgets/WidgetsBindingObserver/didChangeAppLifecycleState.html"&gt;didChangeAppLifecycleState&lt;/a&gt;&lt;/strong&gt; and in this function, we will write our code to handle different state.&lt;/p&gt;

&lt;p&gt;You can find the complete code for the Class as below.&lt;br&gt;
&lt;/p&gt;

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

  @override
  _HomePageState createState() =&amp;gt; _HomePageState();
}

class _HomePageState extends State&amp;lt;HomePage&amp;gt; with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  AppLifecycleState _notification;

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    setState(() {
      if (state == AppLifecycleState.paused) {
        // Your Code goes here
      } else if (state == AppLifecycleState.inactive) {
        // Your Code goes here
      } else {
        // Your Code goes here
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text('Last notification: $_notification');
  }
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That is all folks!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial, we have learned &lt;strong&gt;AppLifeCycleState&lt;/strong&gt; Management Implementation of Mobile App with Flutter. I have also explained the theory portion, so it would help you learn better.&lt;/p&gt;

&lt;p&gt;With the final code, you will learn how to implement it in your Flutter code. To check my other tutorials regarding flutter &lt;strong&gt;&lt;a href="https://instacodeblog.com/category/flutter"&gt;click here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you faced any problem during implementation or know a better way, let me know in the comment section.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://instacodeblog.com/applifecyclestate-management-implementation-in-flutter/"&gt;AppLifeCycleState Management Implementation in Flutter&lt;/a&gt; appeared first on &lt;a href="https://instacodeblog.com"&gt;InstaCodeBlog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>applifecyclestate</category>
      <category>android</category>
    </item>
  </channel>
</rss>
