1. 程式人生 > >我的第一個flutter demo 頂部導航欄加網路請求的基本使用

我的第一個flutter demo 頂部導航欄加網路請求的基本使用

上圖是要實現的效果得意,廢話不多說上程式碼。。由於涉及到公司的介面,所以程式碼裡涉及這塊就不貼出來了。

1 首先建立一個類 繼承 StatelessWidget 由於是我的模組 就命名為MineLayout

class ReadLayout extends StatelessWidget {
  @override
Widget build(BuildContext context) {
    Widget tabBarContainer = new TabBar(//建立TabBar例項
      isScrollable: true, //這個屬性是導航欄是否支援滾動,false則會擠在一起了
      unselectedLabelColor: Colors.grey
, //未選標籤標籤的顏色(這裡定義為灰色) labelColor: Colors.black,//選中的顏色(黑色) indicatorColor: Colors.black,//指示器顏色 indicatorWeight: 2.0,//指示器厚度 tabs: choices.map((Choice choice) {//選項卡 return new Tab( text: choice.title, ); }).toList(), ); Widget tabContainer = new
DefaultTabController( length: choices.length, initialIndex: 0, //初始索引 child: new Column( children: <Widget>[ new Container( constraints: new BoxConstraints.expand( height: Theme.of(context).textTheme.display1.fontSize * 1.1
+ 50.0, ), padding: const EdgeInsets.all(8.0), color: Colors.teal.shade700, alignment: Alignment.center, child: tabBarContainer, ), new Expanded( child: new TabBarView( children: choices.map((Choice choice) { return new BookListView(categoryId: choice.categoryId);//一個屬於展示內容的listview }).toList(), ), ), ], ), ); return tabContainer; } }

注意:上面我不是沒有Appbar 的,所以預設會侵入到系統欄,所以我定義了高度

height: Theme.of(context).textTheme.display1.fontSize * 1.1 + 50.0,

接著定義一個類去封裝頂部標籤
class Choice {
  const Choice({this.title,  this.categoryId});

  final String title;//這個引數是分類名稱
  final int categoryId;//這個適用於網路請求的引數,獲取不同分類列表
}

const List<Choice> choices = const <Choice>[

  const Choice(
    title: '通話故事',
    categoryId: 1,
  ),
  const Choice(
    title: '科幻靈異',
    categoryId: 2,
  ),
  const Choice(
    title: '經典名著',
    categoryId: 3,
  ),
  const Choice(
    title: '科普百科',
    categoryId: 4,
  ),
  const Choice(
    title: '歷史傳記',
    categoryId: 5,
  ),
  const Choice(
    title: '詩歌散文',
    categoryId: 6,
  ),
  const Choice(
    title: '幽默成長',
    categoryId: 7,
  ),
  const Choice(
    title: '寓言傳說',
  ),
];

接著我們來看listview 的具體實現吧。

原理很簡單,就是在初始化時載入用過非同步的方式載入網路資料將請求到的資料放到定義好的集合裡面,然後呼叫setState方法重新構建widget。這時listview的itemcount就有數了。得意

class _BookListViewState extends State<BookListView> {
  List widgets = [];
  int bookId;
  String bookName;
  String coverKey;
  int picture;
  int media;
  int lang;
  int isQuestion;
  String author;
  String introduction;
  int downloadNum;
  String coverUrl;

//  final List<RowsBean> books;
@override
void initState() {
    // TODO: implement initState
super.initState();
    loadData(widget.categoryId);
  }

  @override
Widget build(BuildContext context) {
    return new Scaffold(
        body: new ListView.builder(
            itemCount: widgets.length,
            itemBuilder: (BuildContext context, int position) {
              return getRow(position);
            }));
  }

  loadData(int categoryId) async {
    String dataURL =
        "你的API?categoryId=$categoryId";
    http.Response response = await http.get(dataURL);
    print(response.body);
    Map data = JSON.decode(response.body);

    var retobj = data['retobj'];
    List rows = retobj['rows'];
    widgets = rows;
    setState(() {
//      JsonDecoder decoder = new JsonDecoder();
//
//      // 將給定的JSON字串輸入轉換為其對應的物件
//      List<List<RowsBean>> json = decoder.convert(response.body);
//      // 輸出給定的JSON資料
//      print(json[0][1]);
//      widgets = JSON.decode(response.body);
});
  }

  Widget getRow(int i) {
    return new BookListItem(
      bookId: widgets[i]['bookId'],
      bookName: widgets[i]['bookName'],
      coverKey: widgets[i]['coverKey'],
      picture: widgets[i]['picture'],
      media: widgets[i]['media'],
      lang: widgets[i]['lang'],
      isQuestion: widgets[i]['isQuestion'],
      introduction: widgets[i]['introduction'],
      downloadNum: widgets[i]['downloadNum'],
      author: widgets[i]['author'],
      coverUrl: widgets[i]['coverUrl'],
    );
  }
}



上面涉及到網路請求和json解析,樓主該開始也不知道怎麼解析,官方的都是返回的一個list型別的json,看看我們返回的json型別吧


接著就需要寫item的佈局了,佈局就是左邊一張圖,右邊一個模組,右邊模組採用線性佈局。

import 'package:flutter/material.dart';

import 'package:flutter/rendering.dart';

class BookListItem extends StatelessWidget {
  BookListItem(
      {this.bookId,
      this.bookName,
      this.coverKey,
      this.picture,
      this.media,
      this.lang,
      this.isQuestion,
      this.author,
      this.introduction,
      this.downloadNum,
      this.coverUrl})
      : super(key: new ObjectKey(bookId));
  int bookId;
  String bookName;
  String coverKey;
  int picture;
  int media;
  int lang;
  int isQuestion;
  String author;
  String introduction;
  int downloadNum;
  String coverUrl;

  @override
Widget build(BuildContext context) {
    print('bookId:$bookId');
    Widget titleSection = new Container(
      padding: const EdgeInsets.fromLTRB(12.0, 8.0, 0.0, 0.0),
      child: new Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          new Image.network(
            coverUrl,
            width: 107.0,
            height: 130.0,
          ),
          new Expanded(
            child: new Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                new Container(
                  padding: const EdgeInsets.fromLTRB(6.0, 15.0, 24.0, 0.0),
                  child: new Text(
                    bookName,
                    style: new TextStyle(
                        fontWeight: FontWeight.bold, fontSize: 17.0),
                  ),
                ),
                new Container(
                  padding: const EdgeInsets.fromLTRB(6.0, 16.0, 24.0, 0.0),
                  child: new Text(
                    author,
                    style: new TextStyle(
                        fontWeight: FontWeight.bold, fontSize: 13.0),
                  ),
                ),
                new Container(
                  padding: const EdgeInsets.fromLTRB(6.0, 18.0, 24.0, 2.0),
                  child: new Text(
                    introduction,
                    overflow: TextOverflow.ellipsis,
                    textAlign: TextAlign.start,
                    maxLines: 3,
                    style: new TextStyle(
                        fontSize: 12.0, fontStyle: FontStyle.normal),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );

    return titleSection;
  }
}

ok, 本節就說道這裡,文筆簡陋,見諒,歡迎私信,互相學習。。


相關推薦

一個flutter demo 頂部導航網路請求基本使用

上圖是要實現的效果,廢話不多說上程式碼。。由於涉及到公司的介面,所以程式碼裡涉及這塊就不貼出來了。1 首先建立一個類 繼承 StatelessWidget 由於是我的模組 就命名為MineLayoutclass ReadLayout extends StatelessWidg

React Native 一個小專案其中一些主要功能實現 (頂部導航(可滑動),網路解析,上拉重新整理,下拉載入)

//網路解析 import React, { Component } from "react"; import { View, Text, TouchableOpacity } from "react-native"; import RefreshListView, { Re

android網易頂部導航demo

       隨著時間的推移現在的軟體要求顯示的內容越來越多,所以要在小的螢幕上能夠更好的顯示更多的內容,首先我們會想到底部選單欄,但是有時候想網易新聞要顯示的內容太多,而且又想在主頁面全部顯示出來,所以有加了頂部導航欄,但是Android這樣的移動裝置記憶體是受限的,那

一個Flutter APP

首先需要說明本次部落格我是用的電腦是mac,並且在下沒有使用科學上網,額,對使用window的同學不太友好,日後再來一篇window配置Flutter環境的部落格1.環境配置關於環境配置,我是根據範玉剛大神的部落格做的 (https://blog.csdn.net/singw

一個AngularJS Demo(購物車)

mod 購物 set sco tle ng-model -m -c 刪除 <!DOCTYPE html><html><head>   <meta charset="utf-8" />   <script sr

手機影音四天,頂部標題的布局實現與本地視頻的搜索

頂部標題欄的布局實現與本地視頻的搜索前面講了下面的菜單布局與中間的fragmentLayout的布局與實現,今天就寫了頂部title的布局以及去搜索本地sd卡裏的視頻。 一、頂部布局實現 效果圖如下: 1、分析下: a、這個頂部布局是個LinearLayout布局 b、左

MUI學習02-頂部導航

連接 工具條 -a -c title dcl article header 選項卡 建議:先看一下MUI註意事項 連接:http://ask.dcloud.net.cn/article/122 固定欄靠前 所謂的固定欄,也就是帶有.mui-bar屬性的節點,都是基於fix

ionic3在ios上頂部導航顯示不正常--據頂部有空隙條

在專案中遇到這樣的問題: 如圖: 頂部導航平白多了一道白條,而且這個只是在ios的真機或者是模擬器上才顯示,用chrome和android真機是一點問題沒有,於是就重新下載了一個tabs專案,執行,也沒有問題,一點點兒找原因才發現是因為覺得不需要頂部導航,就給去掉了,於是,解決的

android中如何打造一個動態的底部導航

在開發專案中底部導航是必不可少的控制元件之一,雖然網上已經有很多開源的專案可以用,如果一些特定的需求,導致專案不能用的話,那就頭大了,所以明白如何做一個動態導航欄,還是很有必要的。本教程主要針對一些初級的android程式設計師,利用隨手可得的控制元件來完成,而不是用自定義View的方式

Flutter入坑指南:編寫一個Flutter應用

本文由 愛學園平臺 進行聯合編輯整理輸出 原作者:愛學園——莫比烏斯環 這是 Flutter 系列文章的第二篇,關於 Flutter 的相關學習文章後面還有很多,如果您喜歡的話,請持續關注 ,謝謝! Flutter 是 Google 推出的移動端跨平臺開發框架,使

技術小白之記錄微信小程式頂部導航

現在來說說頂部導航欄的程式碼,先來看看簡單的頂部導航欄的截圖: 可以從上面的圖片看到有寫著[簡介]和[試看]的導航欄內容,下面來記錄下程式碼過程: wxml <!--導航條--> <view class="navbar"> <text wx:for

一個Flutter App

簡單構建一個頁面 程式碼如下: import 'package:flutter/material.dart'; // app 入口 void main() => runApp(new MyApp

Android HIDL一個HelloWorld demo

原址 寫在前面 程式設計師有個癖好,無論是學習什麼新知識,都喜歡以HelloWorld作為一個簡單的例子來開頭,咱們也不例外。 OK,咱這裡都是乾貨,廢話就不多說啦,學習HIDL呢咱們還是需要一些準備工作和門檻的。 準備工作: Android BSP編譯環境 A

Flutter-1: 底部導航

Flutter - 1 : 底部導航欄 預覽圖,大概就是這個熊樣的,對,顏值是襯托來的,其實還是。。。要什麼自行車。。。 1.ymal新增支援包 EventBus的flutter版。 event_bus: ">=1.0.0<2.0.0"

ReactNavtive頂部導航+網路解析跳轉詳情(二)

四:StackNav.js頂部欄 import React, { Component } from “react”; import { createStackNavigator } from “react-navigation”; import TopTabNa

無廢話MVC入門教程二[一個Demo]

MVC入門系列教程-視訊版本,已入駐51CTO學院,文字+視訊學效果更好哦。視訊連結地址如下: 點我檢視視訊。另外,針對該系列教程博主提供有償技術支援,群號:226090960,群內會針對該教程的問題進行及時解答,公用性問題統一講解。學習.NET MVC 只看在《無廢話系列》足夠了,《無廢話系列》簡單、快速、

微信小程式前臺開發——實現登入,底部導航頂部導航(分類顯示)

微信小程式前臺開發,實現登入功能,獲取微信頭像和微信名稱,實現底部導航欄,頂部導航欄(通過導航欄分類顯示內容)。 1、初次開發微信小程式需要去官網下載微信小程式開發工具。 2、通過官方的教程註冊小程式賬號。 3、開啟微信開發者工具新建專案。 選擇專案路徑,填寫

mono for android 自定義titleBar Actionbar 頂部導航 修改 樣式 學習

 以前的我是沒有做筆記的習慣的,學習了後覺得自己能記住,但是最近發現很多學的東西都忘記了,所有現在一有新的知識,就記下來吧。  最近又做一個mono for android 的專案 這次調整比較大,上次做的點餐系統很好用 ,但是做的時候沒有做筆記很多東西都忘記了,這次我把專案涉及到的知識傳到部落格上,方便記

TabLayout與viewpager實現頂部導航

TabLayout是design包的一個元件,常與viewpager搭配使用,主要是因為用法簡單,而且效果也好。下面是效果圖 接下來說說用法:首先匯入依賴 compile 'com.android.support:design:25.3.1' 佈局檔案:activity_

Android之仿今日頭條頂部導航效果

隨著時間的推移現在的軟體要求顯示的內容越來越多,所以要在小的螢幕上能夠更好的顯示更多的內容,首先我們會想到底部選單欄,但是有時候像今日頭條新聞客戶端要顯示的內容太多,而且又想在主介面全部顯示出來,所以有加了頂部導航欄。 今日頭條頂部導航欄區域的主要部分是一個導航選單。導航選