News App DEMO Source Code – Fyne Golang Gui tutorial 70
News App DEMO Source Code – Fyne Golang Gui tutorial 70
In this tutorial we are going to consume news api from gnews.io
Api token can be easily created on gnews.io
Api http request
https://gnews.io/api/v4/top-headlines?token=API-Token
Source Code
<div>
<div>package main</div>
<div>import (</div>
<div> "encoding/json"</div>
<div> "fmt"</div>
<div> "image/color"</div>
<div> "io/ioutil"</div>
<div> "net/http"</div>
<div> "fyne.io/fyne/v2"</div>
<div> "fyne.io/fyne/v2/app"</div>
<div> "fyne.io/fyne/v2/canvas"</div>
<div> "fyne.io/fyne/v2/container"</div>
<div> "fyne.io/fyne/v2/widget"</div>
<div>)</div>
<div>var num_article int = 1</div>
<div>var news News</div>
<div>func main() {</div>
<div> a := app.NewWithID("")</div>
<div> w := a.NewWindow("News App")</div>
<div> w.Resize(fyne.NewSize(300, 400))</div>
<div> URL := fmt.Sprintf("https://gnews.io/api/v4/top-headlines?token=4ae5b4030f29f64bcc70e25417a83699&lang=en&max=100")</div>
<div> //API</div>
<div> res, _ := http.Get(URL)</div>
<div> defer res.Body.Close()</div>
<div> body, _ := ioutil.ReadAll(res.Body)</div>
<div> news, _ = UnmarshalNews(body)</div>
<div> fmt.Println(news)</div>
<div> // num_article = int(news.TotalArticles)</div>
<div> label2 := widget.NewLabel(fmt.Sprintf("No of articles:%d",</div>
<div> news.TotalArticles))</div>
<div> //show title</div>
<div> label3 := widget.NewLabel(fmt.Sprintf("%s", news.Articles[1].Title))</div>
<div> label3.TextStyle = fyne.TextStyle{Bold: true}</div>
<div> label3.Wrapping = fyne.TextWrapBreak</div>
<div> // show articles</div>
<div> entry1 := widget.NewLabel(fmt.Sprintf("%s",</div>
<div> news.Articles[1].Description))</div>
<div> //entry1.MultiLine = true</div>
<div> entry1.Wrapping = fyne.TextWrapBreak</div>
<div> //entry1.Resize(fyne.NewSize(300, 400))</div>
<div> //entry1.Resize(fyne.NewSize(300, 300))</div>
<div> // label4 := widget.NewLabel(fmt.Sprintf("Article: %s", news.Articles[0].Description))</div>
<div> btn := widget.NewButton("Next", func() {</div>
<div> num_article += 1</div>
<div> label3.Text = news.Articles[num_article].Title</div>
<div> entry1.Text = news.Articles[num_article].Description</div>
<div> label3.Refresh()</div>
<div> entry1.Refresh()</div>
<div> })</div>
<div> label1 := canvas.NewText("News App", color.Black)</div>
<div> label1.Alignment = fyne.TextAlignCenter</div>
<div> label1.TextStyle = fyne.TextStyle{Bold: true}</div>
<div> img := canvas.NewImageFromFile("news.png")</div>
<div> // img.Resize(fyne.NewSize(150, 150))</div>
<div> img.FillMode = canvas.ImageFillOriginal</div>
<div> e := container.NewVBox(label1, label3, entry1, btn)</div>
<div> e.Resize(fyne.NewSize(300, 300))</div>
<div> c := container.NewBorder(img, label2, nil, nil, e)</div>
<div> w.SetContent(c)</div>
<div> w.ShowAndRun()</div>
<div>}</div>
<div>// This file was generated from JSON Schema using quicktype, do not modify it directly.</div>
<div>// To parse and unparse this JSON data, add this code to your project and do:</div>
<div>//</div>
<div>// news, err := UnmarshalNews(bytes)</div>
<div>// bytes, err = news.Marshal()</div>
<div>func UnmarshalNews(data []byte) (News, error) {</div>
<div> var r News</div>
<div> err := json.Unmarshal(data, &r)</div>
<div> return r, err</div>
<div>}</div>
<div>func (r *News) Marshal() ([]byte, error) {</div>
<div> return json.Marshal(r)</div>
<div>}</div>
<div>type News struct {</div>
<div> TotalArticles int64 `json:"totalArticles"`</div>
<div> Articles []Article `json:"articles"`</div>
<div>}</div>
<div>type Article struct {</div>
<div> Title string `json:"title"`</div>
<div> Description string `json:"description"`</div>
<div> Content string `json:"content"`</div>
<div> URL string `json:"url"`</div>
<div> Image string `json:"image"`</div>
<div> PublishedAt string `json:"publishedAt"`</div>
<div> Source Source `json:"source"`</div>
<div>}</div>
<div>type Source struct {</div>
<div> Name string `json:"name"`</div>
<div> URL string `json:"url"`</div>
<div>}</div>
</div>
[easy_media_download url=”http://blogvali.com/wp-content/uploads/fyne-golang-downloads/main56.go” text=”Download Code” color=”red_darker”]