IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter-防京东商城项目-通过接口搜索商品数据-16 -> 正文阅读

[移动开发]Flutter-防京东商城项目-通过接口搜索商品数据-16

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

学习目标:
1.通过接口搜索商品

第一步:搜索控制器

var _keywords;

第二步:获取搜索值

在这里插入图片描述

child: TextField(
  autofocus: true,
  decoration: InputDecoration(
      border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(30),
          borderSide: BorderSide.none)),



//--------------------------------------------
  onChanged: (value){
    this._keywords=value;
  },
//--------------------------------------------



),

第三步:把搜索值传递到列表页

在这里插入图片描述

actions: <Widget>[
  InkWell(
    child: Container(
      height: ScreenAdapter.height(68),
      width: ScreenAdapter.width(80),
      child: Row(
        children: <Widget>[Text("搜索")],
      ),
    ),
    onTap: () {



//--------------------------------------------
        //返回的时候直接返回到首页 
        Navigator.pushReplacementNamed(context, '/productList',arguments: {
            "keywords":this._keywords
        });
//--------------------------------------------




        
    },
  )

第四步:编写列表控制器顶部的搜索栏 用来搜索商品

现在把搜索控制器顶部的搜索栏 复制
复制搜索控制器的搜索栏代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Widget build(BuildContext context) {
  return Scaffold(






//--------------------------------------------
      appBar: AppBar(
        title: Container(
          child: TextField(
            autofocus: true,
            decoration: InputDecoration(
                border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(30),
                    borderSide: BorderSide.none)),
            onChanged: (value){
              this._keywords=value;
            },
          ),
          height: ScreenAdapter.height(68),
          decoration: BoxDecoration(
              color: Color.fromRGBO(233, 233, 233, 0.8),
              borderRadius: BorderRadius.circular(30)),
        ),
        actions: <Widget>[
          InkWell(
            child: Container(
              height: ScreenAdapter.height(68),
              width: ScreenAdapter.width(80),
              child: Row(
                children: <Widget>[Text("搜索")],
              ),
            ),
            onTap: () {
  //--------------------------------------------          
                //删除下面的代码
                Navigator.pushReplacementNamed(context, '/productList',arguments: {
                    "keywords":this._keywords
 //--------------------------------------------                   
                });
            },
          )
        ],
      ),
//--------------------------------------------








      body: Container(

第五步:替换掉下面的代码

在这里插入图片描述
在这里插入图片描述

Widget build(BuildContext context) {
  ScreenAdaper.init(context);

  return Scaffold(
      key: _scaffoldKey,



//--------------------------------------------
      appBar: AppBar(
        title: Text("商品列表"),
        actions: <Widget>[
          Text("")
        ],
      ),
//--------------------------------------------



      endDrawer: Drawer(

5.复制完代码之后把搜索框里面的一个属性true改为false 目的是想进来控制器的时候默认不把键盘弹上来

autofocus: false,

第六步:把外面的搜索值传递进来进行显示

在这里插入图片描述

child: TextField(
  autofocus: false,
  decoration: InputDecoration(
      border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(30),
          borderSide: BorderSide.none)),
  onChanged: (value){


//--------------------------------------------
    setState(() {
      this._keywords=value;
    });
//--------------------------------------------




  },
),
height: ScreenAdaper.height(68)

6.1搜索值实时显示
在这里插入图片描述

key: _scaffoldKey,
appBar: AppBar(
  title: Container(
    child: TextField(
      controller: this._initKeywordsController,//--------------------------------------
      autofocus: false,
      decoration: InputDecoration(
          border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(30),
              borderSide: BorderSide.none)),
      onChanged: (value){

第七步:.把搜索词传递到列表控制器的搜索框显示

顺便创建搜索属性 值改变的时候用这些值存储起来,然后通过接口调用请求数据
7.1定义3个新的属性并赋值默认值

在这里插入图片描述
下面的代码写的地方参考下面的图片位置

//配置search搜索框的值
var _initKeywordsController=new TextEditingController();
var _cid;
var _keywords;

在这里插入图片描述

7.2赋值属性
在这里插入图片描述

@override
void initState() {
  super.initState();



//--------------------------------------------
  this._cid=widget.arguments["cid"];
  this._keywords=widget.arguments["keywords"];    
  //给search框框赋值 
  this._initKeywordsController.text=this._keywords;
//--------------------------------------------



  
  _getProductListData();
  //监听滚动条滚动事件
  _scrollController.addListener(() {

7.3替换代码 替换红色框的代码
旧的代码
在这里插入图片描述
新的代码
在这里插入图片描述

//获取商品列表的数据
_getProductListData() async {
  setState(() {
    this.flag = false;
  });






//--------------------------------------------
   var api;
  if(this._keywords==null){
    api ='${Config.domain}api/plist?cid=${this._cid}&page=${this._page}&sort=${this._sort}&pageSize=${this._pageSize}';
  }else{     
    api ='${Config.domain}api/plist?search=${this._keywords}&page=${this._page}&sort=${this._sort}&pageSize=${this._pageSize}';
  }
//--------------------------------------------







  // print(api);
  var result = await Dio().get(api);

第八步:编写点击搜索按键 点击调用搜索接口

在这里插入图片描述

actions: <Widget>[
  InkWell(
    child: Container(
      height: ScreenAdapter.height(68),
      width: ScreenAdapter.width(80),
      child: Row(
        children: <Widget>[Text("搜索")],
      ),
    ),
    onTap: () {
       this._subHeaderChange(1);//--------------------------------------------
    },
  )

第九步:解决搜索不到数据重复转圈的问题
9.1创建属性
在这里插入图片描述

//是否有搜索的数据
 bool _hasData = true;
1.2计算值
var result = await Dio().get(api);
var productList = new ProductModel.fromJson(result.data);

//判断是否有搜索数据
if(productList.result.length==0 && this._page==1){
  setState(() {
    this._hasData=false; 
  });
}else{
    this._hasData=true; 
}
//判断最后一页有没有数据
if (productList.result.length < this._pageSize) {

1.3应用
在这里插入图片描述

      endDrawer: Drawer(
        child: Container(
          child: Text("实现筛选功能"),
        ),
      ),
      body: _hasData?Stack(
        children: <Widget>[
          _productListWidget(),
          _subHeaderWidget(),
        ],
      ):Center(
        child: Text("没有您要浏览的数据")
      )        
    );
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:02:02  更:2021-09-03 12:02:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 6:02:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码