**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),
),
)
],
)
],
),
));
}
}
Flutter练习
于 2022-02-24 19:23:31 首次发布