Flower_gift 简单Flutter实战app(一)

0001.jpg
好久没在简书写东西了,基本上自己的笔记都写在印象上去了。这次分享flutter呢,是记录一下自己用flutter做的第一个app. 首先这个app没有flutter的知识讲解,只是简单的记录一下自己这个app完成的过程。 推荐大家学习flutter可以去 技术胖学习。
项目git地址:flower_gift
app框架搭建 - 2019-07-26

app首页:


0002.png

1.创建app

2.创建app开发相关文件夹
lib文件夹下创建:

config :基本配置文件,如url地址等
model :数据模型
pages :界面文件
provide :数据交互
routers :路由文件
service :网络请求方法
  1. tabBar文件编写:
import "package:flutter/material.dart";
import 'package:flutter/cupertino.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';//界面适配插件
import './home_page.dart';
import './category_page.dart';
import './flower_find_page.dart';
import './car_shop_page.dart';
import './mine_page.dart';
import 'package:provide/provide.dart'; //数据交互插件
import '../provide/tabBarTap_provide.dart'; //tabBar Provide文件

class TabBarPage extends StatelessWidget {
 
 //tabBar子界面
 final List<BottomNavigationBarItem> bottomTabs = [
       BottomNavigationBarItem(
          icon: Icon(CupertinoIcons.home),
          title: Text("首页")
       ),
        BottomNavigationBarItem(
          icon: Icon(CupertinoIcons.collections),
          title: Text("分类")
       ),
        BottomNavigationBarItem(
          icon: Icon(CupertinoIcons.share),
          title: Text("花现")
       ),
        BottomNavigationBarItem(
          icon: Icon(CupertinoIcons.shopping_cart),
          title: Text("购物车")
       ),
        BottomNavigationBarItem(
          icon: Icon(CupertinoIcons.profile_circled),
          title: Text("我的")
       ),
 ];
 //对应的tabBar子页面
 final List<Widget> tabBarSubPages = [
    HomePage(),
    CategoryPage(),
    FlowerFindPage(),
    CarShopPage(),
    MinePage()
 ];

  @override
  Widget build(BuildContext context) {
   //界面适配
    ScreenUtil.instance = ScreenUtil(width: 750.0,height: 1334.0)..init(context);//给定初始尺寸,也就是基本尺寸,其余的都在此基础上缩放
    
    return Scaffold(
       backgroundColor: Colors.white,
       bottomNavigationBar: Provide<TabBarTapProvide>(
          builder: (context,child,tabBarTap){
             return BottomNavigationBar(
                type: BottomNavigationBarType.fixed,
                currentIndex: tabBarTap.currentTabIndex,
                fixedColor: Color.fromRGBO(255, 95, 63, 1.0),
                items: bottomTabs,
                onTap: (index){
                      Provide.value<TabBarTapProvide>(context).bottomTabBarTap(index);
                },
             );
          },
       ),
       body: Provide<TabBarTapProvide>(
          builder: (context,child,tabBarTap){
            return IndexedStack(
              index: tabBarTap.currentTabIndex,
              children: tabBarSubPages,
            );
          },
       )
     );
  }
}



tabBar Provide 文件:

import 'package:flutter/widgets.dart';

class TabBarTapProvide with ChangeNotifier{
   int currentTabIndex = 0;
   bottomTabBarTap(tapIndex){
     currentTabIndex = tapIndex;
     //通知
     notifyListeners();
   }
}

通过provide来控制这个数据的变化,从而控制界面变化。尤其是在完全不相关的多个widget之间的数据交互。 除了编写对应的provide文件外,还需要在main.dart中注册。 用provide控制数据变化,比用StatefulWidget状态组件要方便得多

  1. 首页:
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';//iOS风格UI
import './pages/tabBar_page.dart';
import 'package:provide/provide.dart';//状态管理
import './provide/tabBarTap_provide.dart';//底部tab点击状态管理

void main() {
  var providers = Providers();
  var tabBarTapProvide = TabBarTapProvide();
  //状态管理注册
  providers
  ..provide(Provider<TabBarTapProvide>.value(tabBarTapProvide));
  runApp(
    ProviderNode(
      child: MyApp(),
      providers: providers,
    )
  );
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return Container(
         child: MaterialApp(
            title: "花礼网",
            debugShowCheckedModeBanner: false,
            theme: ThemeData(
              primaryColor: Color.fromRGBO(45, 60, 49, 1.0),//主题色
            ),
            home: TabBarPage(),
         ),
    );
  }
}

首页主要就看看这个provide注册

5.各个子界面:
5.1: homePage.dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../service/service_http_method.dart';
import 'dart:convert';

class HomePage extends StatelessWidget {
  
  
  @override
  Widget build(BuildContext context) {
    _getHomePageData();
    return Scaffold(
      appBar: AppBar(
        title: Text("花礼网",
           style: TextStyle(
             color: Color.fromRGBO(255, 95, 63, 1.0),
             fontSize: ScreenUtil().setSp(45.0) 
            ),
         ),
      ),
      body:Container(
         child: Center(
           child: Text("我是首页"),
         ),
      )
    );
  }
 
  void _getHomePageData(){
     requestGet("shouye").then((val){
          var data = json.decode(val.toString());
          print("获取首页数据成功:${data}");
     });
  }
  
}

给homePage页面加上了导航栏,其次进行了首页数据请求的测试。

5.2: category.dart

import 'package:flutter/material.dart';

class CategoryPage extends StatelessWidget {
  

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text("我是分类"),
      ),
    );
  }
}

其它三个界面只是标题不一样。

6.网络请求配置:
config/service_url_config.dart

const baseServiceUrl = "https://fbz.dbhome.com/";(不是真实接口地址,怕放上来侵权,也不懂。。。)

const requestUrl = {
   "shouye":baseServiceUrl + "shouye/v3",//首页数据请求
   "itemList":baseServiceUrl + "itemlist/list",//分类页面
};

service/service_http_method.dart

import 'package:dio/dio.dart';
import 'dart:async';
import 'dart:io';
import '../config/service_url_config.dart';

//抽取公共的网络请求方法

Future requestGet(url,{formData}) async{
  try{
     print("开始获取网络数据...");
     Response response;
     Dio dio = new Dio();
     dio.options.responseType = ResponseType.plain;//不整这个就会报Unexpected character错误
     dio.options.contentType = ContentType.parse("application/x-www-form-urlencoded");
     if(formData == null){
       //无参
       response = await dio.post(requestUrl[url]);
     }else{
       response = await dio.post(requestUrl[url],data:formData);
     }
     if(response.statusCode == 200){
        return response.data;
      }else{
        throw Exception("<<<<<<请求失败,检查接口或者参数>>>>>>");
      }

  }catch(e){
     return print("HTTPERROR: ============> ${e}");
  }
}

最后R 加载,数据请求成功,最后效果:


22222.gif
下一篇就是首页的编写Flower_gift 简单Flutter实战app(二)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容