Flutter练习

**Flutter\HOOK_UP_RENT-master\lib\pages\home\tab_search\filter_bar**

**data:**
//结果数据类型
class FilterBarResult {
  final String? areaId;
  final String? priceId;
  final String? rentTypeId;
  final List<String>? moreIds;

  FilterBarResult(
      {this.areaId,
      this.priceId,
      this.rentTypeId,
      this.moreIds,
      String? priceTypeId,
      List<String>? moreId});
}

//通用类型
class GeneralType {
  final String name;
  final String id;

  GeneralType(this.name, this.id);
}

List<GeneralType> areaList = [
  GeneralType('区域1', '11'),
  GeneralType('区域2', '22'),
];
List<GeneralType> priceList = [
  GeneralType('价格1', '22'),
  GeneralType('价格2', 'aa'),
];
List<GeneralType> rentTypeList = [
  GeneralType('出租类型1', 'bb'),
  GeneralType('出租类型2', '22'),
];
List<GeneralType> roomTypeList = [
  GeneralType('房屋类型1', '11'),
  GeneralType('房屋类型2', '22'),
];
List<GeneralType> orientedList = [
  GeneralType('方向1', '99'),
  GeneralType('方向2', 'cc'),
];
List<GeneralType> floorList = [
  GeneralType('楼层1', 'aa'),
  GeneralType('楼层2', 'bb'),
];

**file_reawer:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/pages/home/tab_search/filter_bar/data.dart';
import 'package:hook_up_rent/scoped_model/room_filter.dart';
import 'package:hook_up_rent/utils/scopoed_model_helper.dart';
import 'package:hook_up_rent/widgets/common_title.dart';

class FilterDrawer extends StatelessWidget {
  const FilterDrawer({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var selectIds = ScopedModelHelper.getModel<FilterBarModel>(context)
        .selectedList
        .toList();
    var dataList = ScopedModelHelper.getModel<FilterBarModel>(context).dataList;
    if (dataList != null) {
      roomTypeList = dataList['roomTypeList']!;
      orientedList = dataList['orientedList']!;
      floorList = dataList['floorList']!;
    }
    _onChange(String val) {
      ScopedModelHelper.getModel<FilterBarModel>(context)
          .selectedListToggleItem(val);
    }

    return Drawer(
      child: SafeArea(
        child: ListView(
          children: [
            CommonTitle('户型'),
            FilterDrawerItem(
              list: roomTypeList,
              selectIds: selectIds,
              onChange: _onChange,
            ),
            CommonTitle('朝向'),
            FilterDrawerItem(
              list: orientedList,
              selectIds: selectIds,
              onChange: _onChange,
            ),
            CommonTitle('楼层'),
            FilterDrawerItem(
              list: floorList,
              selectIds: selectIds,
              onChange: _onChange,
            ),
          ],
        ),
      ),
    );
  }
}

class FilterDrawerItem extends StatelessWidget {
  final List<GeneralType>? list;
  final List? selectIds;
  final ValueChanged<String>? onChange;

  const FilterDrawerItem({Key? key, this.list, this.selectIds, this.onChange})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(left: 10, right: 10),
      child: Wrap(
        spacing: 10,
        runSpacing: 10,
        children: list!.map((item) {
          var isActive = selectIds!.contains(item.id);

          return GestureDetector(
            onTap: () {
              if (onChange != null) {
                onChange!(item.id);
              }
            },
            behavior: HitTestBehavior.translucent,
            child: Container(
              width: 100,
              height: 40,
              decoration: BoxDecoration(
                  color: isActive ? Colors.green : Colors.white,
                  border: Border.all(width: 1, color: Colors.green)),
              child: Center(
                child: Text(
                  item.name,
                  style:
                      TextStyle(color: isActive ? Colors.white : Colors.black),
                ),
              ),
            ),
          );
        }).toList(),
      ),
    );
  }
}

**index:**
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:hook_up_rent/pages/home/tab_search/filter_bar/data.dart';
import 'package:hook_up_rent/pages/home/tab_search/filter_bar/item.dart';
import 'package:hook_up_rent/scoped_model/room_filter.dart';
import 'package:hook_up_rent/utils/common_pick.dart';
import 'package:hook_up_rent/utils/scopoed_model_helper.dart';

class FilterBar extends StatefulWidget {
  final ValueChanged<FilterBarResult>? onChange;

  const FilterBar({Key? key, this.onChange}) : super(key: key);

  @override
  _FilterBarState createState() => _FilterBarState();
}

class _FilterBarState extends State<FilterBar> {
  bool isAreaActive = false;
  bool isRentTypeActive = false;
  bool isPriceActive = false;
  bool isFilterActive = false;

  String areaId = '';
  String rentTypeId = '';
  String priceId = '';
  List<String> moreIds = [];

  _onAreaChange(context) {
    setState(() {
      isAreaActive = !isAreaActive;
    });
    var result = CommonPicker.showPicker(
        value: 0,
        context: context,
        options: areaList.map((item) => item.name).toList());
    if (result == null) return;
    result.then((index) {
      if (index == null) return;
      setState(() {
        areaId = areaList[index].id;
      });
    });
    result.whenComplete(() {
      setState(() {
        isAreaActive = false;
      });
    });
    _onChange;
  }

  _onRentTypeChange(context) {
    setState(() {
      isRentTypeActive = !isRentTypeActive;
    });
    var result = CommonPicker.showPicker(
        value: 0,
        context: context,
        options: rentTypeList.map((item) => item.name).toList());
    if (result == null) return;
    result.then((index) {
      if (index == null) return;
      setState(() {
        areaId = rentTypeList[index].id;
      });
    });
    result.whenComplete(() {
      setState(() {
        isRentTypeActive = false;
      });
    });
    _onChange;
  }

  _onPriceChange(context) {
    setState(() {
      isPriceActive = !isPriceActive;
    });
    var result = CommonPicker.showPicker(
        value: 0,
        context: context,
        options: priceList.map((item) => item.name).toList());
    if (result == null) return;
    result.then((index) {
      if (index == null) return;
      setState(() {
        areaId = priceList[index].id;
      });
    });
    result.whenComplete(() {
      setState(() {
        isPriceActive = false;
      });
    });
    _onChange;
  }

  _onFilterChange(context) {
    Scaffold.of(context).openDrawer();
  }

  _onChange() {
    var selectedList =
        ScopedModelHelper.getModel<FilterBarModel>(context).selectedList;
    if (widget.onChange != null) {
      widget.onChange!(FilterBarResult(
        areaId: areaId,
        rentTypeId: rentTypeId,
        priceId: priceId,
        moreId: moreIds,
        moreIds: selectedList.toList(),
      ));
    }
  }

  _getData() {
    Map<String, List<GeneralType>> dataList = Map<String, List<GeneralType>>();
    dataList['roomTypeList'] = roomTypeList;
    dataList['orientedList'] = orientedList;
    dataList['floorList'] = floorList;

    ScopedModelHelper.getModel<FilterBarModel>(context).dataList = dataList;
  }

  @override
  void initState() {
    // TODO: implement initState
    Timer.run(_getData);
    super.initState();
  }

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    _onChange();
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
          border: Border(bottom: BorderSide(color: Colors.black12))),
      height: 51,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          Item(
            title: '区域',
            isActive: isAreaActive,
            onTap: _onAreaChange,
          ),
          Item(
            title: '方式',
            isActive: isRentTypeActive,
            onTap: _onRentTypeChange,
          ),
          Item(
            title: '租金',
            isActive: isPriceActive,
            onTap: _onPriceChange,
          ),
          Item(
            title: '筛选',
            isActive: false,
            onTap: _onFilterChange,
          )
        ],
      ),
    );
  }
}

**item:**
import 'package:flutter/material.dart';

class Item extends StatelessWidget {
  final String? title;
  final bool? isActive;
  final Function(BuildContext)? onTap;

  const Item({Key? key, this.title, this.isActive, this.onTap})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    var color = isActive! ? Colors.green : Colors.black87;
    return GestureDetector(
      onTap: () {
        if (onTap != null) onTap!(context);
      },
      child: Container(
        child: Row(
          children: [
            Text(
              title!,
              style: TextStyle(color: color),
            ),
            Icon(Icons.arrow_drop_down, size: 20, color: color),
          ],
        ),
      ),
    );
  }
}

**data_list:**
// 搜索页数据准备
class RoomListItemData {
  final String id;
  final String title;
  final String subTitle;
  final String imageUrl;
  final List<String> tags;
  final int price;
  const RoomListItemData(
      {required this.id,
      required this.title,
      required this.subTitle,
      required this.imageUrl,
      required this.tags,
      required this.price});
}

const List<RoomListItemData> dataList = [
  RoomListItemData(
      title: '朝阳门南大街 2室1厅 8300元',
      subTitle: "二室/114/东|北/朝阳门南大街",
      imageUrl:
          "https://tva1.sinaimg.cn/large/006y8mN6ly1g6wtu9t1kxj30lo0c7796.jpg",
      price: 1200,
      id: 'roomDetail/1',
      tags: ["近地铁", "集中供暖", "新上", "随时看房"]),
  RoomListItemData(
      title: '整租 · CBD总部公寓二期 临近国贸 精装修 随时拎包入住',
      subTitle: "一室/110/西/CBD总部公寓二期",
      imageUrl:
          "https://tva1.sinaimg.cn/large/006y8mN6ly1g6wtu5s7gcj30lo0c7myq.jpg",
      price: 6000,
      id: 'roomDetail/1',
      tags: ["近地铁", "随时看房"]),
  RoomListItemData(
      title: '朝阳门南大街 2室1厅 8300元',
      subTitle: "二室/114/东|北/朝阳门南大街",
      imageUrl:
          "https://tva1.sinaimg.cn/large/006y8mN6ly1g6wtu5s7gcj30lo0c7myq.jpg",
      price: 1200,
      id: 'roomDetail/1',
      tags: ["近地铁", "集中供暖", "新上", "随时看房"]),
  RoomListItemData(
      title: '整租 · CBD总部公寓二期 临近国贸 精装修 随时拎包入住',
      subTitle: "一室/110/西/CBD总部公寓二期",
      imageUrl:
          "https://tva1.sinaimg.cn/large/006y8mN6ly1g6wtu9t1kxj30lo0c7796.jpg",
      price: 6000,
      id: 'roomDetail/1',
      tags: ["近地铁", "随时看房"]),
];

**index:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/pages/home/tab_search/data_list.dart';
import 'package:hook_up_rent/pages/home/tab_search/filter_bar/index.dart';
import 'package:hook_up_rent/widgets/room_list_item_widget.dart';
import 'package:hook_up_rent/widgets/search_bar/index.dart';

import 'filter_bar/file_drawer.dart';

class TabSearch extends StatefulWidget {
  const TabSearch({Key? key}) : super(key: key);

  @override
  _TabSearchState createState() => _TabSearchState();
}

class _TabSearchState extends State<TabSearch> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      endDrawer: FilterDrawer(),
      appBar: AppBar(
        actions: [Container()],
        title: SearchBar(
          showLoaction: true,
          showMap: true,
          onSearch: () {
            Navigator.of(context).pushNamed('search');
          },
        ),
        backgroundColor: Colors.white,
      ),
      body: Column(
        children: [
          Container(
            height: 51,
            child: FilterBar(
              onChange: (data) {},
            ),
          ),
          Expanded(
              child: ListView(
            children: dataList.map((item) => RoomListItemWidget(item)).toList(),
          ))
        ],
      ),
    );
  }
}
**Flutter\HOOK_UP_RENT-master\lib\pages\home\tab_profile**

**advertisement:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/widgets/common_image.dart';

class Advertisement extends StatelessWidget {
  const Advertisement({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(top: 30, bottom: 20, left: 10, right: 10),
      child: CommonImage(
        src:
            'https://tva1.sinaimg.cn/large/006y8mN6ly1g6te62n8f4j30j603vgou.jpg',
      ),
    );
  }
}

**function_button:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/pages/home/tab_profile/function_button_data.dart';

import 'funtion_button_widget.dart';

class FuntionButton extends StatelessWidget {
  const FuntionButton({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Wrap(
        spacing: 1,
        runSpacing: 1,
        children: list.map((item) => FunctionButtonWidget(item)).toList(),
      ),
    );
  }
}
**function_button_data:**
import 'package:flutter/material.dart';

class FunctionButtonItem {
  final String imageUrl;
  final String title;
  final Function? onTapHandle;
  FunctionButtonItem(this.imageUrl, this.title, this.onTapHandle);
}

final List<FunctionButtonItem> list = [
  FunctionButtonItem('static/images/home_profile_record.png', "看房记录",
      (context) {
    print('测试打印');
  }),
  FunctionButtonItem('static/images/home_profile_order.png', '我的订单', null),
  FunctionButtonItem('static/images/home_profile_favor.png', '我的收藏', null),
  FunctionButtonItem('static/images/home_profile_id.png', '身份认证', null),
  FunctionButtonItem('static/images/home_profile_message.png', '联系我们', null),
  FunctionButtonItem('static/images/home_profile_contract.png', '电子合同', null),
  FunctionButtonItem('static/images/home_profile_wallet.png', '钱包', (context) {
    print('测试打印');
  }),
  FunctionButtonItem('static/images/home_profile_house.png', "房屋管理", (context) {
    bool isLogin = true; //假设先设置未登录
    if (isLogin) {
      Navigator.of(context).pushNamed('RoomManagePage');
    }
  })
];
**funtion_button_widget:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/widgets/common_image.dart';

import 'function_button_data.dart';

class FunctionButtonWidget extends StatelessWidget {
  final FunctionButtonItem data;
  const FunctionButtonWidget(this.data, {Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        if (data.onTapHandle != null) {
          data.onTapHandle!(context);
        }
      },
      child: Container(
        margin: EdgeInsets.only(top: 30),
        width: MediaQuery.of(context).size.width * 0.33,
        child: Column(
          children: [
            CommonImage(
              src: data.imageUrl,
              // width: 100,
              // height: 100,
            ),
            Padding(padding: EdgeInsets.only(top: 10)),
            Text(data.title)
          ],
        ),
      ),
    );
  }
}
**head:**
import 'package:flutter/material.dart';

var longinRegisterStyle = TextStyle(fontSize: 20, color: Colors.white);

class Header extends StatelessWidget {
  @override
  Widget _loginBuilder(BuildContext context) {
    String userName = '大胖';
    String userImage =
        'https://tva1.sinaimg.cn/large/006y8mN6ly1g6tbnovh8jj30hr0hrq3l.jpg';
    return Container(
      padding: EdgeInsets.only(left: 20, top: 10, bottom: 20),
      decoration: BoxDecoration(color: Colors.green),
      height: 95,
      child: Row(
        children: [
          Container(
            height: 65,
            width: 65,
            margin: EdgeInsets.only(right: 15),
            child: CircleAvatar(
                backgroundImage: NetworkImage(
                    'https://tva1.sinaimg.cn/large/006y8mN6ly1g6tbnovh8jj30hr0hrq3l.jpg')),
          ),
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                userName,
                style: longinRegisterStyle,
              ),
              Text(
                '查看个人资料',
                style: TextStyle(color: Colors.white),
              )
            ],
          )
        ],
      ),
    );
  }

  @override
  Widget _notLoginBuilder(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(left: 20, top: 10, bottom: 20),
      decoration: BoxDecoration(color: Colors.green),
      height: 95,
      child: Row(
        children: [
          Container(
            height: 65,
            width: 65,
            margin: EdgeInsets.only(right: 15),
            child: CircleAvatar(
                backgroundImage: NetworkImage(
                    'https://tva1.sinaimg.cn/large/006y8mN6ly1g6tbgbqv2nj30i20i2wen.jpg')),
          ),
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Row(
                children: [
                  Padding(padding: EdgeInsets.only(top: 6)),
                  GestureDetector(
                    child: Text('登录', style: longinRegisterStyle),
                    onTap: () {
                      Navigator.of(context).pushNamed('login');
                    },
                  ),
                  Text(
                    '/',
                    style: longinRegisterStyle,
                  ),
                  GestureDetector(
                    child: Text('注册', style: longinRegisterStyle),
                    onTap: () {
                      Navigator.of(context).pushNamed('register');
                    },
                  ),
                ],
              ),
              Text(
                '登录后可以体验更多',
                style: TextStyle(color: Colors.white),
              )
            ],
          )
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    var isLogin = false;
    return isLogin ? _loginBuilder(context) : _notLoginBuilder(context);
  }
}
**index:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/pages/home/info/index.dart';

import 'advertisement.dart';
import 'function_button.dart';
import 'head.dart';

class TabProfile extends StatelessWidget {
  const TabProfile({Key? key}) : super(key: key);

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        title: Text('我的'),
        backgroundColor: Colors.green,
        actions: [
          IconButton(
              onPressed: () {
                Navigator.of(context).pushNamed('SettingPage');
              },
              icon: Icon(Icons.settings))
        ],
      ),
      body: ListView(
        children: [
          Header(),
          FuntionButton(),
          Advertisement(),
          Info(),
        ],
      ),
    );
  }
}
**Flutter\HOOK_UP_RENT-master\lib\pages\home\tab_info**
**index:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/pages/home/info/index.dart';
import 'package:hook_up_rent/widgets/search_bar/index.dart';

class TabInfo extends StatefulWidget {
  const TabInfo({Key? key}) : super(key: key);

  @override
  _TabInfoState createState() => _TabInfoState();
}

class _TabInfoState extends State<TabInfo> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: SearchBar(
          showLoaction: true,
          showMap: true,
          onSearch: () {
            Navigator.of(context).pushNamed('search');
          },
        ),
        backgroundColor: Colors.white,
      ),
      body: ListView(
        children: [
          Padding(padding: EdgeInsets.only(bottom: 10)),
          Info(),
          Info(),
          Info()
        ],
      ),
    );
  }
}
**Flutter\HOOK_UP_RENT-master\lib\pages\home\tab_index**
**index:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/pages/home/info/index.dart';
import 'package:hook_up_rent/widgets/common_swipper.dart';
import 'package:hook_up_rent/widgets/search_bar/index.dart';

import 'index_navigator.dart';
import 'index_recommond.dart';

class TabIndex extends StatelessWidget {
  const TabIndex({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: SearchBar(
            showLoaction: true,
            showMap: true,
            onSearch: () {
              Navigator.of(context).pushNamed('login');
            },
          ),
          backgroundColor: Colors.white,
        ),
        body: ListView(
          children: [
            CommonSwiper(),
            IndexNavigator(),
            IndexRecommond(),
            Info(showTitle: true),
            Text('这是内容区域'),
          ],
        ));
  }
}
**index_navigator:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/widgets/common_image.dart';

import 'index_navigator_item_copy.dart';

class IndexNavigator extends StatelessWidget {
  const IndexNavigator({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(top: 6, bottom: 5),
      child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: indexNavigatorItemList
              .map((item) => InkWell(
                    onTap: () {
                      item.onTap(context);
                    },
                    child: Column(
                      children: <Widget>[
                        CommonImage(
                          src: item.imagreUrl,
                          width: 47.5,
                        ),
                        Text(item.title,
                            style: TextStyle(fontWeight: FontWeight.w500))
                      ],
                    ),
                  ))
              .toList()),
    );
  }
}
**index_navigator_item_copy:**
import 'package:flutter/material.dart';

class IndexNavigatorItem {
  late final String title;
  late final String imagreUrl;
  late final Function(BuildContext context) onTap;

  IndexNavigatorItem(this.title, this.imagreUrl, this.onTap);
}

List<IndexNavigatorItem> indexNavigatorItemList = [
  IndexNavigatorItem('整租', 'static/images/home_index_navigator_total.png',
      (BuildContext context) {
    Navigator.of(context).pushNamed('login');
  }),
  IndexNavigatorItem('合租', 'static/images/home_index_navigator_share.png',
      (BuildContext context) {
    Navigator.of(context).pushNamed('login');
  }),
  IndexNavigatorItem('地图找房', 'static/images/home_index_navigator_map.png',
      (BuildContext context) {
    Navigator.of(context).pushNamed('login');
  }),
  IndexNavigatorItem('去出租', 'static/images/home_index_navigator_rent.png',
      (BuildContext context) {
    Navigator.of(context).pushNamed('login');
  }),
];
**index_recommnd_item_widget:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/widgets/common_image.dart';

import 'index_recommond_data.dart';

var textStyle = TextStyle(fontSize: 14, fontWeight: FontWeight.w500);

class IndexRecommondItemWidget extends StatelessWidget {
  final IndexRecommendItem data;

  const IndexRecommondItemWidget(this.data, {Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print("data.navigateUrl = $data.navigateUrl");
        Navigator.of(context).pushNamed(data.navigateUrl);
      },
      child: Container(
        padding: EdgeInsets.all(20),
        decoration: BoxDecoration(
          color: Colors.white,
        ),
        width: (MediaQuery.of(context).size.width - 10 * 3) / 2,
        height: 100,
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Column(
              children: [
                Text(
                  data.title,
                  style: textStyle,
                ),
                Text(
                  data.subTitle,
                  style: textStyle,
                ),
              ],
            ),
            CommonImage(
              src: data.imageUrl,
              width: 55,
            )
          ],
        ),
      ),
    );
  }
}
**index_recommond:**
import 'package:flutter/material.dart';

import 'index_recommnd_item_widget.dart';
import 'index_recommond_data.dart';

class IndexRecommond extends StatelessWidget {
  final List<IndexRecommendItem> dataList;

  const IndexRecommond({Key? key, this.dataList = indexRecommendData})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: Color(0x800000),
      ),
      child: Column(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: const [
              Text(
                '房屋推荐',
                style:
                    TextStyle(color: Colors.black, fontWeight: FontWeight.w600),
              ),
              Text(
                '更多',
                style: TextStyle(color: Colors.black54),
              )
            ],
          ),
          const SizedBox(
            height: 10,
          ),
          Wrap(
            runSpacing: 10,
            spacing: 10,
            children:
                dataList.map((item) => IndexRecommondItemWidget(item)).toList(),
          )
        ],
      ),
    );
  }
}
**index_recommond_data:**
class IndexRecommendItem {
  final String title;
  final String subTitle;
  final String imageUrl;
  final String navigateUrl;
  const IndexRecommendItem(
      this.title, this.subTitle, this.imageUrl, this.navigateUrl);
}

const List<IndexRecommendItem> indexRecommendData = [
  IndexRecommendItem(
      '家住回龙观', '归属的感觉', 'static/images/home_index_recommend_1.png', 'login'),
  IndexRecommendItem(
      '宜居四五环', '大都市生活', 'static/images/home_index_recommend_2.png', 'login'),
  IndexRecommendItem(
      '喧嚣三里屯', '繁华的背后', 'static/images/home_index_recommend_3.png', 'login'),
  IndexRecommendItem(
      '比邻十号线', '地铁心连心', 'static/images/home_index_recommend_4.png', 'login'),
];
**Flutter\HOOK_UP_RENT-master\lib\pages\home\info**
**index:**
import 'package:flutter/material.dart';

import 'info.dart';
import 'item_widget.dart';

class Info extends StatelessWidget {
  final bool showTitle;
  final List<InfoItem> dataList;

  const Info({Key? key, this.showTitle = false, this.dataList = infoData})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: [
          if (showTitle)
            Container(
              padding: EdgeInsets.all(10),
              alignment: Alignment.centerLeft,
              child: Text(
                '最新咨询',
                style:
                    TextStyle(color: Colors.black, fontWeight: FontWeight.w600),
              ),
            ),
          Column(
            children: dataList.map((item) => ItemWidget(item)).toList(),
          )
        ],
      ),
    );
  }
}
**info:**
// 资讯数据准备,注意下面的格式

class InfoItem {
  final String title;
  final String imageUrl;
  final String source;
  final String time;
  final String navigateUrl;

  const InfoItem(
      this.title, this.imageUrl, this.source, this.time, this.navigateUrl);
}

const List<InfoItem> infoData = [
  InfoItem(
      '置业选择 | 三室一厅 河间的古雅别院',
      'https://wx2.sinaimg.cn/mw1024/005SQLxwly1g6f89l4obbj305v04fjsw.jpg',
      "新华网",
      "两天前",
      'login'),
  InfoItem(
      '置业佳选 | 大理王宫 苍山洱海间的古雅别院',
      'https://wx2.sinaimg.cn/mw1024/005SQLxwly1g6f89l6hnsj305v04fab7.jpg',
      "新华网",
      "一周前",
      'login'),
  InfoItem(
      '置业选择 | 安居小屋 花园洋房 清新别野',
      'https://wx4.sinaimg.cn/mw1024/005SQLxwly1g6f89l5jlyj305v04f75q.jpg',
      "新华网",
      "一周前",
      'login'),
  InfoItem(
      '置业选择 | 安居小屋 花园洋房 清新别野 山清水秀',
      'https://wx4.sinaimg.cn/mw1024/005SQLxwly1g6f89l5jlyj305v04f75q.jpg',
      "新华网",
      "一周前",
      'login'),
  InfoItem(
      '置业选择 | 安居小屋 花园洋房 清新别野',
      'https://wx4.sinaimg.cn/mw1024/005SQLxwly1g6f89l5jlyj305v04f75q.jpg',
      "新华网",
      "一周前",
      'login'),
];
**item_widget:**
import 'package:flutter/material.dart';
import 'package:hook_up_rent/widgets/common_image.dart';

import 'info.dart';

var textStyle = TextStyle(color: Colors.black54);

class ItemWidget extends StatelessWidget {
  final InfoItem data;

  const ItemWidget(this.data, {Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
        margin: EdgeInsets.only(left: 10, right: 10, bottom: 10),
        height: 100,
        child: Row(
          children: [
            CommonImage(src: data.imageUrl, width: 120, height: 90),
            const Padding(padding: EdgeInsets.only(left: 10)),
            Expanded(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Text(
                    data.title,
                    textAlign: TextAlign.left,
                    style: TextStyle(
                        color: Colors.black, fontWeight: FontWeight.w600),
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Text(data.source, style: textStyle),
                      Text(
                        data.time,
                        style: textStyle,
                      )
                    ],
                  )
                ],
              ),
            )
          ],
        ));
  }
}
**Flutter\HOOK_UP_RENT-master\lib\pages**
**loading:**
import 'dart:async';
import 'package:flutter/material.dart';
class LoadingPage extends StatefulWidget {
  const LoadingPage({Key? key}) : super(key: key);
  @override
  State<LoadingPage> createState() => _LoadingPageState();
}
class _LoadingPageState extends State<LoadingPage> {
  @override
  void initState() {
    // TODO: implement initState
    Timer(Duration(seconds: 3), () {
  Navigator.of(context).pushReplacementNamed('/');
    });
    Timer.run(() {});
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
          image: DecorationImage(
              image: AssetImage('static/images/loading.jpg'),
              fit: BoxFit.fill)),
    );
  }
}
**login:**
import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:hook_up_rent/scoped_model/auth.dart';
import 'package:hook_up_rent/utils/common_toast.dart';
import 'package:hook_up_rent/utils/dio_http.dart';
import 'package:hook_up_rent/utils/scopoed_model_helper.dart';
import 'package:hook_up_rent/utils/store.dart';
import 'package:hook_up_rent/utils/string_is_null_or_empty.dart';

class LoginPage extends StatefulWidget {
  const LoginPage({Key? key}) : super(key: key);

  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  var usernameController = TextEditingController();
  var passwordController = TextEditingController();
  void _loginHandle() async {
    var userName = usernameController.text;
    var passWord = passwordController.text;
    if (stringIsNullOrEmpty(userName) || stringIsNullOrEmpty(passWord)) {
      CommonToast.showToast('用户名或密码不能为空!');
      return;
    }
    const url = '/login';
    var params = {'userName': userName, 'passWord': passWord};
    var res = await DioHttp.of(context).post(url, params);
    var resMap = json.decode(res.toString());

    print(resMap);

    int status = resMap['data']['code'];
    String description = resMap['data']['message'] ?? '内部错误';
    CommonToast.showToast(description);
    if (status == 0) {
      String token = resMap['data']['token'];
      Store store = await Store.getInstance();
      await store.setString(StoreKeys.token, token);

      ScopedModelHelper.getModel<AuthModel>(context).login(token, context);
      Timer(Duration(seconds: 1), () {
        Navigator.of(context).pop();
      });
    }
  }

  bool _showPassworld = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('登录'),
          backgroundColor: Colors.green,
        ),
        body: SafeArea(
          minimum: EdgeInsets.all(30),
          child: ListView(
            children: [
              TextField(
                  controller: usernameController,
                  decoration:
                      InputDecoration(labelText: '用户名', hintText: '请输入用户名')),
              SizedBox(height: 20),
              TextField(
                  controller: passwordController,
                  obscureText: !_showPassworld,
                  decoration: InputDecoration(
                      labelText: '密码',
                      hintText: '请输入密码',
                      suffixIcon: IconButton(
                        icon: Icon(_showPassworld
                            ? Icons.visibility_off
                            : Icons.visibility),
                        onPressed: () {
                          setState(() {
                            _showPassworld = !_showPassworld;
                          });
                        },
                      ))),
              SizedBox(height: 20),
              Container(
                height: 45,
                child: ElevatedButton(
                    style: ButtonStyle(
                        backgroundColor:
                            MaterialStateProperty.all(Colors.green)),
                    onPressed: () {
                      _loginHandle();
                    },
                    child: Text('登录', style: TextStyle(color: Colors.white))),
              ),
              SizedBox(
                height: 20,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('还没有账号'),
                  SizedBox(height: 20),
                  TextButton(
                    onPressed: () {
                      print('去注册');
                      Navigator.of(context).pushNamed('register');
                    },
                    child: Text(
                      '去注册',
                      style: TextStyle(color: Colors.green),
                    ),
                  )
                ],
              )
            ],
          ),
        ));
  }
}
**register:**
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:hook_up_rent/utils/common_toast.dart';
import 'package:hook_up_rent/utils/dio_http.dart';
import 'package:hook_up_rent/utils/string_is_null_or_empty.dart';

class RegisterPage extends StatefulWidget {
  const RegisterPage({Key? key}) : super(key: key);

  @override
  _RegisterPageState createState() => _RegisterPageState();
}

class _RegisterPageState extends State<RegisterPage> {
  var usernameController = TextEditingController();
  var passwordController = TextEditingController();
  var repeatPasswordController = TextEditingController();
  _registerHandler() async {
    var username = usernameController.text;
    var password = passwordController.text;
    var repeatPassword = repeatPasswordController.text;
    if (stringIsNullOrEmpty(username) || stringIsNullOrEmpty(username)) {
      CommonToast.showToast('用户名或密码不能为空!');
      return;
    }
    if (password != repeatPassword) {
      CommonToast.showToast('两次输入密码不一致');
      return;
    }

    const url = '/register';
    var params = {'username': username, 'password': password};
    var res = await DioHttp.of(context).post(url, params);
    var resString = json.decode(res.toString());
    print(resString);

    int status = resString['data']['code'];
    String description = resString['data']['message'] ?? '内部错误';
    CommonToast.showToast(description);
    if (status == 0) {
      Navigator.of(context).pushNamed('login');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('注册'),
          backgroundColor: Colors.green,
        ),
        body: SafeArea(
          minimum: EdgeInsets.all(30),
          child: ListView(
            children: [
              TextField(
                  controller: usernameController,
                  decoration:
                      InputDecoration(labelText: '用户名', hintText: '请输入用户名')),
              SizedBox(height: 20),
              TextField(
                  controller: passwordController,
                  decoration: InputDecoration(
                    labelText: '密码',
                    hintText: '请输入密码',
                  )),
              SizedBox(height: 20),
              TextField(
                  controller: repeatPasswordController,
                  decoration: InputDecoration(
                    labelText: '密码',
                    hintText: '请确认密码',
                  )),
              SizedBox(height: 20),
              Container(
                height: 45,
                child: ElevatedButton(
                    style: ButtonStyle(
                        backgroundColor:
                            MaterialStateProperty.all(Colors.green)),
                    onPressed: () {
                      _registerHandler();
                    },
                    child: Text('注册', style: TextStyle(color: Colors.white))),
              ),
              SizedBox(
                height: 20,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('还没有账号'),
                  SizedBox(height: 20),
                  TextButton(
                    onPressed: () {
                      Navigator.popUntil(context, ModalRoute.withName("login"));
                    },
                    child: Text(
                      '去登录',
                      style: TextStyle(color: Colors.green),
                    ),
                  )
                ],
              )
            ],
          ),
        ));
  }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值