Commit ec19dac5 authored by “Icebear”'s avatar “Icebear”

Merge branch 'master' of http://git.naiterui.com/zouzhisheng/netrain_flutter_app

* 'master' of http://git.naiterui.com/zouzhisheng/netrain_flutter_app:
  完成注册页面
  修改页面,页面传值路由初探
  定义主体颜色
  路由传值取值
  修改

# Conflicts:
#	netrain_flutter_app/lib/main.dart
parents 556ea774 8d2f6f19
......@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objectVersion = 51;
objects = {
/* Begin PBXBuildFile section */
......@@ -355,7 +355,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = K5YZT8RS9U;
DEVELOPMENT_TEAM = 4TYNTWZC9Y;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
......@@ -493,7 +493,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = K5YZT8RS9U;
DEVELOPMENT_TEAM = 4TYNTWZC9Y;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
......@@ -525,7 +525,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = K5YZT8RS9U;
DEVELOPMENT_TEAM = 4TYNTWZC9Y;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
......
/// 项目颜色配置
class AppColors{
/// 标题背景颜色
static const titleBackgroundColor = 0xffffffff;
/// 主色
static const mainColor = 0xff2893FF;
/// hint颜色
static const hintText = 0xffb4b4b4;
/// 输入框字体颜色
static const EditTextColor = 0xff333333;
/// 页面背景颜色
static const scaffoldBackgroundColor = 0xffffffff;
/// 分割线颜色
static const dividerColor = 0xffeeeeee;
/// 控件禁用时的颜色
static const disabledColor = 0xffdddddd;
}
\ No newline at end of file
import 'package:flutter/material.dart';
class jssPageDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key)
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("jss测试页面"),
),
body:Column(
children:[
RaisedButton(
onPressed:() {
Navigator.of(context).push(MaterialPageRoute(
builder: (context){
return twoVCdemo();
},
settings: RouteSettings(
name: "我是传过去的",
arguments:"参数,是对象类型",
)
),
);
},
child: Text("点击进入下一页,页面传值与返回。"),
),
textDemo(),
buttonDemo(),
imageiconDemo(),
]
)
);
return Container(
child: Column(
children: [
textDemo(),
buttonDemo(),
imageiconDemo(),
],
)
);
}
}
class twoVCdemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("jssDemo第二个页面的标题"),
),
body: Column(
children: [
IconButton(
icon: Icon(Icons.home),
onPressed:() {
Navigator.of(context).push(MaterialPageRoute(
builder: (context){
return nextViewDemo();
},
settings: RouteSettings(
name: "我是传过去的",
arguments:"参数,是对象类型",
),
//是否有返回
maintainState: false,
//类似iOS ture 弹窗式推送界面 false 是push
fullscreenDialog: false,
),
);
},
),
],
),
);
}
}
class nextViewDemo extends StatelessWidget {
// const nextViewDemo({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("jss测试第三界面"),
),
body: Column(
children: [
RaisedButton(onPressed: () {
Navigator.of(context).pop(
"我传过来值了,这是一个对象类型"
);
},
child: Text("点击返回传值"),
),
],
),
);
}
}
import 'dart:ffi';
import 'dart:html';
import 'package:flutter/material.dart';
class textDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
......@@ -77,9 +203,9 @@ class imageiconDemo extends StatelessWidget {
children: [
Icon(Icons.add),
IconButton(onPressed: (){}, icon: Icon(Icons.home)),
Image.network("http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezEVpFL9_MH8XSqbHklw_maA_-0O-JAG-gv2I-uvEAQqh-teALqpO_NZN1EbyMj5iOpf3Z1ZREUPx5_1lniEkZj6mijxFoM8VqoaPcH0KOxWwCyPbmri5Hlwk-A8u4pBUbGLW2x882fEua1eOAEbBWTdTqxEMA631a3yr2qBWOz88FPpAVsair-sXakr4y6eguntj86fZCDab3.DR_aOQZsYpb2glyIiUr2s1f_uQr1Fv20.U1Yk0ZDqVSXS_0KY5IissIpS_QMU8pi110KGUHY1PWT0Iybq0ZKGujYk0APGujY1rjc0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYdrH0knHm0mhwGujdKnWT1rj0sPHnLPYm1fHndrRmdrH64rjDkwjT3PHcsPsKbmvPb5fK9TdqGuAnqujcVmhwbX0KzIjY3P1T0TgKGujYs0Z7Wpyfqn0K9mWYsg100TZ0qn0KVIZ0qn0KbuAqs5H00ThCqn0KYIgnqnHT1P1DYnWD3P1nYP1RznWDYnW60mynqnfKsUWYs0ZK9I7qhUA7M5H00ugwGujYVnfK9TLKWm1Ys0ZNspy4Wm1Ys0AuWIgfqn0K9uAu_myTqnfKLuMFEUHY0mMfqnfKzug7Y5HDvnWRLnW64rHTvrjm0Tv-b5Hbsn16Lm179n1F9nHRvrj60ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuR0AVG5H00UgfqnWfkn0KVm1Ys0AdWgvuzUvYqn0Kbmy4dmhNxTAk9Uh-bT1Ys0A7bTgbqVSXS_0K9uZ7Y5H00pgPWUjYs0Z7VIjYs0A7bgLPEIgFWuHYsczn0mLFW5HRkrjcL",
fit: BoxFit.fitWidth
),
// Image.network("http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezEVpFL9_MH8XSqbHklw_maA_-0O-JAG-gv2I-uvEAQqh-teALqpO_NZN1EbyMj5iOpf3Z1ZREUPx5_1lniEkZj6mijxFoM8VqoaPcH0KOxWwCyPbmri5Hlwk-A8u4pBUbGLW2x882fEua1eOAEbBWTdTqxEMA631a3yr2qBWOz88FPpAVsair-sXakr4y6eguntj86fZCDab3.DR_aOQZsYpb2glyIiUr2s1f_uQr1Fv20.U1Yk0ZDqVSXS_0KY5IissIpS_QMU8pi110KGUHY1PWT0Iybq0ZKGujYk0APGujY1rjc0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYdrH0knHm0mhwGujdKnWT1rj0sPHnLPYm1fHndrRmdrH64rjDkwjT3PHcsPsKbmvPb5fK9TdqGuAnqujcVmhwbX0KzIjY3P1T0TgKGujYs0Z7Wpyfqn0K9mWYsg100TZ0qn0KVIZ0qn0KbuAqs5H00ThCqn0KYIgnqnHT1P1DYnWD3P1nYP1RznWDYnW60mynqnfKsUWYs0ZK9I7qhUA7M5H00ugwGujYVnfK9TLKWm1Ys0ZNspy4Wm1Ys0AuWIgfqn0K9uAu_myTqnfKLuMFEUHY0mMfqnfKzug7Y5HDvnWRLnW64rHTvrjm0Tv-b5Hbsn16Lm179n1F9nHRvrj60ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuR0AVG5H00UgfqnWfkn0KVm1Ys0AdWgvuzUvYqn0Kbmy4dmhNxTAk9Uh-bT1Ys0A7bTgbqVSXS_0K9uZ7Y5H00pgPWUjYs0Z7VIjYs0A7bgLPEIgFWuHYsczn0mLFW5HRkrjcL",
// fit: BoxFit.fitWidth
// ),
Image.asset("ic_home_normal.png")
],
);
......
......@@ -13,8 +13,7 @@ class _HomePageState extends State {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
return Scaffold(
bottomNavigationBar: BottomNavigationBar(
backgroundColor: Colors.white,
selectedFontSize: 10,
......@@ -37,7 +36,6 @@ class _HomePageState extends State {
],
),
body: showBody(),
),
);
}
......
......@@ -16,15 +16,32 @@ class _RegisterState extends State {
final phoneController = TextEditingController();
final codeController = TextEditingController();
final passwordController = TextEditingController();
var isShowPassword = false;
var isShowClean = false;
@override
Widget build(BuildContext context) {
// 获取上一个页面的传值
List<String> args = ModalRoute.of(context).settings.arguments;
void initState() {
super.initState();
phoneController.text = args.first;
nameController.addListener(() {
setState(() {});
});
phoneController.addListener(() {
setState(() {});
});
codeController.addListener(() {
setState(() {});
});
passwordController.addListener(() {
print("密码 ${passwordController.text}");
setState(() {
isShowClean = passwordController.text.isNotEmpty;
});
});
}
@override
Widget build(BuildContext context) {
return registerWidget();
}
......@@ -38,51 +55,147 @@ class _RegisterState extends State {
}
Widget registerWidget() {
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.white,
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.of(context).popUntil(ModalRoute.withName("main"));
// Navigator.of(context).pushNamed("login2");
},
),
centerTitle: true,
title: Text("注册"),
elevation: 0,
),
home: Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.of(context).popUntil(ModalRoute.withName("main"));
// Navigator.of(context).pushNamed("login2");
},
),
centerTitle: true,
title: Text("注册"),
elevation: 0,
),
body: Container(
margin: EdgeInsets.fromLTRB(16, 16, 16, 0),
child: ListView(
children: [
_getTextField("请输入姓名",nameController),
_getTextField("请输入手机号码",phoneController),
Stack(children: [
_getTextField("请输入验证码",codeController),
// Positioned(child: )
body: Container(
margin: EdgeInsets.fromLTRB(16, 0, 16, 0),
child: ListView(
children: [
_getTextField(TextInputType.text,"请输入姓名", nameController, 10, false),
_getTextField(TextInputType.number,"请输入手机号码", phoneController, 11, false),
Stack(
children: [
_getTextField(TextInputType.number,"请输入验证码", codeController, 8, false),
Positioned(
child: Text("获取验证码"),
right: 16,
top: 20,
)
],
),
_getPassWordField(),
Text(
"密码由9-16位大小写字母、数字加特殊符号组成",
style:
TextStyle(color: Color(AppColors.mainColor), fontSize: 12),
),
Container(
margin: EdgeInsets.only(top: 20),
height: 40,
child: ElevatedButton(
style: ButtonStyle(
backgroundColor:
MaterialStateProperty.resolveWith((states) {
if (states.contains(MaterialState.disabled)) {
return Color(AppColors.disabledColor);
}
return Color(AppColors.mainColor);
}),
),
child: Text(
"注册",
style: TextStyle(color: Colors.white),
),
onPressed: checkIsAllEmpty() ? null : onRegisterClick),
)
],
)),
);
}
],),
onRegisterClick() {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("注册")));
}
_getTextField("请输入9-16位密码",passwordController),
],
),
)),
/// 校验是否全部为空
bool checkIsAllEmpty() {
if (phoneController.text.isNotEmpty &&
nameController.text.isNotEmpty &&
codeController.text.isNotEmpty &&
passwordController.text.isNotEmpty) {
return false;
}
return true;
}
Widget _getPassWordField() {
TextField password =
_getTextField(TextInputType.number,"请输入9-16位密码", passwordController, 16, isShowPassword);
return Stack(
children: [
password,
Positioned(
right: 32,
top: 10,
child: Visibility(
visible: isShowClean,
child: IconButton(
icon: Icon(Icons.close),
onPressed: () {
setState(() {
passwordController.text = "";
});
}),
)),
Positioned(
right: 0,
top: 10,
child: Visibility(
visible: isShowClean,
child: IconButton(
icon: isShowPassword
? Icon(Icons.visibility_off)
: Icon(Icons.visibility),
onPressed: () {
setState(() {
isShowPassword = !password.obscureText;
});
},
))),
],
);
}
/// 输入框
Widget _getTextField(String hintText,TextEditingController controller){
Widget _getTextField(TextInputType keyboardType,String hintText, TextEditingController controller,
int maxLength, bool isPassword) {
return TextField(
style: TextStyle(color: Color(AppColors.EditTextColor),fontSize: 16),
keyboardType: keyboardType,
obscureText: isPassword,
buildCounter: (context, {currentLength, isFocused, maxLength}) => null,
maxLength: maxLength,
autofocus: false, // 自动获取焦点
decoration: InputDecoration(
labelStyle: TextStyle(height: 0.5),
//装饰
alignLabelWithHint: true,
contentPadding: EdgeInsets.only(top: 20, bottom: 10),
enabledBorder: UnderlineInputBorder(
// 默认输入状态的下划线边框
borderSide:
BorderSide(color: Color(AppColors.dividerColor), width: 0.5)),
focusedBorder: UnderlineInputBorder(
// 获取焦点后
borderSide:
BorderSide(color: Color(AppColors.mainColor), width: 0.5)),
errorBorder: UnderlineInputBorder(
// 错误的时候
borderSide: BorderSide(color: Colors.red, width: 0.5)),
hintText: hintText,
hintStyle: TextStyle(color: Color(AppColors.hintText)),
// labelText: hintText.substring(3)
),
controller: controller,
);
}
}
\ No newline at end of file
}
......@@ -5,7 +5,7 @@ import 'package:netrain_flutter_app/laishanqi/mqtt/MqttClient.dart';
import 'package:netrain_flutter_app/laishanqi/netrain/Http/HttpUtil.dart';
import 'package:netrain_flutter_app/laishanqi/netrain/user/RegisterPage.dart';
import '../HomePage.dart';
import '../PharmacistHomePage.dart';
import '../../../common/Images.dart';
/// 登录页
......@@ -21,22 +21,20 @@ class _LoginState extends State<LoginPage> {
final codeController = TextEditingController();
@override
Widget build(BuildContext context) {
print("loginPage.dart initState");
void initState() {
super.initState();
var mqtt = MqttClient();
mqtt.connect();
HttpUtil.get(HttpUtil.global_config).then((Response value) {
Fluttertoast.showToast(msg: "global_config 请求成功 ");
});
}
return MaterialApp(
title: '登陆页',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Container(
alignment: Alignment.topCenter,
......@@ -136,7 +134,6 @@ class _LoginState extends State<LoginPage> {
),
),
),
),
);
}
......
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/xuehao/car_details.dart';
import 'package:netrain_flutter_app/common/AppColors.dart';
import 'package:netrain_flutter_app/xuehao/list_page.dart';
import 'package:netrain_flutter_app/zhangfeng/TestPage.dart';
......@@ -11,6 +13,8 @@ import 'laishanqi/netrain/user/RegisterPage.dart';
import 'laishanqi/photo.dart';
import 'zhangfeng/UserModel.dart';
import 'jishuaishuai/student.dart';
import 'zhangfeng/LoginPage.dart';
void main() {
......@@ -30,7 +34,11 @@ class MyApp extends StatelessWidget {
title: 'Flutter Demo',
initialRoute: "main",
theme: ThemeData(
primarySwatch: Colors.blue,
primaryColor: Color(AppColors.titleBackgroundColor),
hintColor: Color(AppColors.hintText),
accentColor: Color(AppColors.mainColor),
dividerColor: Color(AppColors.dividerColor),
scaffoldBackgroundColor: Color(AppColors.scaffoldBackgroundColor),
visualDensity: VisualDensity.adaptivePlatformDensity,
),
routes: <String, WidgetBuilder>{
......@@ -44,12 +52,15 @@ class MyApp extends StatelessWidget {
"LoginRequestPage":(context) => LoginRequestPage(),
"TestPage": (context) => SampleAppPage(),
"main": (context) => mainPage(),
"student":(context) => jssPageDemo(),
"car_details":(context) =>CarDetailsPage()
},
),
onWillPop: () async {
Fluttertoast.showToast(msg: "退出");
return true;
});
}
}
......@@ -94,7 +105,7 @@ class _RouterNavigatorState extends State<RouterNavigator> {
_item("登录网络请求", LoginRequestPage(), 'LoginRequestPage'),
_item("zhangfengTest页面",List_Page(),'TestPage'),
_item("listview页面",List_Page(),'listPage'),
_item("jssDemo", jssPageDemo(), 'student')
],
),
);
......
import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/xuehao/Car.dart';
/**
* @author xuehao
* on 2021/7/9
*/
class CarDetailsPage extends StatefulWidget {
String name, imageUrl;
CarDetailsPage({Key key, @required this.name, @required this.imageUrl})
: super(key: key);
@override
_CarDetailsState createState() => _CarDetailsState(name, imageUrl);
_CarDetailsState createState() => _CarDetailsState();
}
class _CarDetailsState extends State<CarDetailsPage> {
String name, imageUrl;
_CarDetailsState(this.name, this.imageUrl);
Car args;
@override
Widget build(BuildContext context) {
args = ModalRoute.of(context).settings.arguments;
return MaterialApp(
title: "car_details",
home: Scaffold(
......@@ -37,9 +32,8 @@ class _CarDetailsState extends State<CarDetailsPage> {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(name),
SizedBox(height: 40),
Image.network(imageUrl),
Text(args.name),
Image.network(args.imageUrl),
],
),
),
......
import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/xuehao/car_details.dart';
import 'Car.dart';
class List_Page extends StatefulWidget {
......@@ -11,58 +9,73 @@ class List_Page extends StatefulWidget {
EasyRefreshController _controller = EasyRefreshController();
class _ListPageState extends State<List_Page> {
class _ListPageState extends State<List_Page> with WidgetsBindingObserver {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "listPage",
theme: ThemeData(
primarySwatch: Colors.blue,
return new Scaffold(
appBar: AppBar(
title: Text("ListView"),
centerTitle: true,
//leading 返回按键
//GestureDetector 用于事件触发
leading: GestureDetector(
onTap: () {
//当前页面出栈
Navigator.pop(context);
},
//左上角返回的小箭头
child: Icon(Icons.arrow_back_ios),
),
home: Scaffold(
appBar: AppBar(
title: Text("ListView"),
centerTitle: true,
//leading 返回按键
//GestureDetector 用于事件触发
leading: GestureDetector(
onTap: () {
//当前页面出栈
Navigator.pop(context);
},
//左上角返回的小箭头
child: Icon(Icons.arrow_back_ios),
),
),
body: EasyRefresh(
//下拉刷新头布局、可以自定义
header: TaurusHeader(),
//上拉加载尾布局,可以自定义
footer: TaurusFooter(),
enableControlFinishRefresh: true,
enableControlFinishLoad: true,
//刷新和加载的控制器,用于控制刷新和加载
controller: _controller,
child: ListView.builder(
//返回数据条数
itemCount: datas.length,
//itemBuilder 需要返回一个Widget
itemBuilder: _getDatas,
),
//刷新动作被触发
onRefresh: () async {
refreshData();
},
//加载动作被触发
onLoad: () async {
loadData();
},
),
));
),
body: EasyRefresh(
//下拉刷新头布局、可以自定义
header: TaurusHeader(),
//上拉加载尾布局,可以自定义
footer: TaurusFooter(),
enableControlFinishRefresh: true,
enableControlFinishLoad: true,
//刷新和加载的控制器,用于控制刷新和加载
controller: _controller,
child: ListView.builder(
//返回数据条数
itemCount: datas.length,
//itemBuilder 需要返回一个Widget
itemBuilder: (context,index){
return _getDatas(index);
},
),
//刷新动作被触发
onRefresh: () async {
refreshData();
},
//加载动作被触发
onLoad: () async {
loadData();
},
),
);
}
void dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this);
print("dispose");
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
print("initState");
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print(state);
}
///获取item视图
Widget _getDatas(BuildContext context, int position) {
Widget _getDatas(int position) {
return Container(
child: GestureDetector(
child: Card(
......@@ -85,15 +98,14 @@ class _ListPageState extends State<List_Page> {
),
onTap: () {
var data = datas[position];
Fluttertoast.showToast(msg: "我点击了${data.name}");
Navigator.push(context, new MaterialPageRoute(builder: (context) => new CarDetailsPage(name: data.name,imageUrl: data.imageUrl,)));
Navigator.pushNamed(context, "car_details", arguments: data);
},
));
}
///刷新数据
Future<void> refreshData() async {
await Future.delayed(Duration(seconds: 3), () {
await Future.delayed(Duration(seconds: 2), () {
setState(() {
for (int i = 0; i < datas.length; i++) {
datas[i].name = "刷新后的数据$i";
......@@ -105,7 +117,7 @@ class _ListPageState extends State<List_Page> {
///加载数据
Future<void> loadData() async {
await Future.delayed(Duration(seconds: 3), () {
await Future.delayed(Duration(seconds: 2), () {
setState(() {
for (int i = 0; i < 10; i++) {
datas.add(Car(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment