1.下拉刷新、上拉加载
在flutter官方sdk中给我们提供了下拉刷新组件RefreshIndicator,但是没有提供上拉分页加载。
但是在Flutter ListView中有一个ScrollController属性,来判断是否滚动到底部来做加载更多
下拉刷新:
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'dart:convert';
class Category extends StatefulWidget {
@override
_CategoryState createState() => _CategoryState();
}
class _CategoryState extends State<Category> {
List list = [];
@override
void initState() {
super.initState();
this._getData();
}
_getData() async{
var url = 'http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1';
var response = await Dio().get(url);
print(response);
setState(() {
this.list = json.decode(response.data)['result'];
});
}
Future<void> onRefresh() async {
print('下拉刷新');
await this._getData();
return ;
// 刷新的圈圈消失
//await Future.delayed(Duration(milliseconds: 2000),(){
// print('请求完成');
//});
}
@override
Widget build(BuildContext context) {
return Container(
child: this.list.length>0 ?
RefreshIndicator(
onRefresh: this.onRefresh,
child: ListView.builder(
itemCount: this.list.length,
itemBuilder: (context,index){
return Column(
children: <Widget>[
ListTile(
title: Text(
'${this.list[index]['title']}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
Divider()
],
);
}
)
)
:
Text('加载中...')
);
}
}
上拉加载:
_scrollController.position.pixels 滚动的距离
_scrollController.position.maxScrollExtent 屏幕总高度
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'dart:convert';
class Category extends StatefulWidget {
@override
_CategoryState createState() => _CategoryState();
}
class _CategoryState extends State<Category> {
List list = [];
ScrollController scrollController = new ScrollController();
int pageNo = 1;
@override
void initState() {
super.initState();
this._getData();
// 监听滚动条事件
scrollController.addListener((){
// 获取滚动条下拉的距离
print(scrollController.position.pixels);
// 获取整个页面的高度
print(scrollController.position.maxScrollExtent);
if (scrollController.position.pixels > scrollController.position.maxScrollExtent - 40) {
this._getData();
}
});
}
_getData() async{
var url = 'http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=${this.pageNo}';
var response = await Dio().get(url);
print(response);
setState(() {
this.list.addAll(json.decode(response.data)['result']);
this.pageNo++;
});
}
Future<void> onRefresh() async {
print('下拉刷新');
await this._getData();
return ;
// 刷新的圈圈消失
//await Future.delayed(Duration(milliseconds: 2000),(){
// print('请求完成');
//});
}
@override
Widget build(BuildContext context) {
return Container(
child: this.list.length>0 ?
RefreshIndicator(
onRefresh: this.onRefresh,
child: ListView.builder(
controller: this.scrollController,
itemCount: this.list.length,
itemBuilder: (context,index){
if (index == this.list.length - 1) {
return Column(
children: <Widget>[
ListTile(
title: Text(
'${this.list[index]['title']}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
Divider(),
_getMoreWidget()
],
);
} else {
return Column(
children: <Widget>[
ListTile(
title: Text(
'${this.list[index]['title']}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
Divider()
],
);
}
}
)
)
:
_getMoreWidget()
);
}
}
Widget _getMoreWidget(){
return Center(
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
'加载中...',
style: TextStyle(fontSize: 16),
),
CircularProgressIndicator(
strokeWidth: 1,
)
],
),
),
);
}
2.flutter解析html页面
第一种方式:flutter_html(第三方pub)
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'dart:convert';
import 'package:flutter_html/flutter_html.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
List list = [];
_DetailPageState({this.arguments});
@override
void initState() {
super.initState();
this._getData();
}
_getData() async{
var url = "http://www.phonegap100.com/appapi.php?a=getPortalArticle&aid=${this.arguments['aid']}";
var response = await Dio().get(url);
setState(() {
this.list = json.decode(response.data)['result'];
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(''),
),
body: Center(
child: ListView(
children: <Widget>[
Text('${this.list.length > 0 ? this.list[0]['title'] : ''}'),
Container(
child: this.list.length > 0 ?
Html(
data: this.list[0]['content'],
)
:
Text(''),
)
],
),
) // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
第二种方式:
webview,使用第三方插件webview_flutter
前提:
iOS:
在ios/Runner/Info.plist配置
<dict>
<key>io.flutter.embedded_views_preview</key>
<true/>
</dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Android:
在android\app\src\main\AndroidManifest.xml中配置:
android:usesCleartextTraffic="true"
实例:
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
_DetailPageState({this.arguments});
@override
void initState() {
super.initState();
print(this.arguments);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(''),
),
body: WebView(
initialUrl: 'http://www.phonegap100.com/newscontent.php?aid=${this.arguments['aid']}'
)
);
}
}
3. flutter获取设备信息 以及使用高德api定位
获取设备信息:
使用第三方库:device_info
import 'package:flutter/material.dart';
import 'package:device_info/device_info.dart';
import 'dart:io';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
static final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
Map<String, dynamic> _deviceData = <String, dynamic>{};
_DetailPageState({this.arguments});
@override
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
Map<String, dynamic> deviceData;
if (Platform.isAndroid) {
deviceData = _readAndroidBuildData(await deviceInfoPlugin.androidInfo);
} else if (Platform.isIOS) {
deviceData = _readIosDeviceInfo(await deviceInfoPlugin.iosInfo);
}
setState(() {
_deviceData = deviceData;
});
}
Map<String, dynamic> _readAndroidBuildData(AndroidDeviceInfo build) {
return <String, dynamic>{
'version.securityPatch': build.version.securityPatch,
'version.sdkInt': build.version.sdkInt,
'version.release': build.version.release,
'version.previewSdkInt': build.version.previewSdkInt,
'version.incremental': build.version.incremental,
'version.codename': build.version.codename,
'version.baseOS': build.version.baseOS,
'board': build.board,
'bootloader': build.bootloader,
'brand': build.brand,
'device': build.device,
'display': build.display,
'fingerprint': build.fingerprint,
'hardware': build.hardware,
'host': build.host,
'id': build.id,
'manufacturer': build.manufacturer,
'model': build.model,
'product': build.product,
'supported32BitAbis': build.supported32BitAbis,
'supported64BitAbis': build.supported64BitAbis,
'supportedAbis': build.supportedAbis,
'tags': build.tags,
'type': build.type,
'isPhysicalDevice': build.isPhysicalDevice,
'androidId': build.androidId,
'systemFeatures': build.systemFeatures,
};
}
Map<String, dynamic> _readIosDeviceInfo(IosDeviceInfo data) {
return <String, dynamic>{
'name': data.name,
'systemName': data.systemName,
'systemVersion': data.systemVersion,
'model': data.model,
'localizedModel': data.localizedModel,
'identifierForVendor': data.identifierForVendor,
'isPhysicalDevice': data.isPhysicalDevice,
'utsname.sysname:': data.utsname.sysname,
'utsname.nodename:': data.utsname.nodename,
'utsname.release:': data.utsname.release,
'utsname.version:': data.utsname.version,
'utsname.machine:': data.utsname.machine,
};
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
Platform.isAndroid ? 'Android Device Info' : 'iOS Device Info'
)
),
body: ListView(
children: _deviceData.keys.map((String property) {
return Row(
children: <Widget>[
Container(
padding: const EdgeInsets.all(10.0),
child: Text(
property,
style: const TextStyle(
fontWeight: FontWeight.bold,
),
),
),
Expanded(
child: Container(
padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),
child: Text(
'${_deviceData[property]}',
maxLines: 10,
overflow: TextOverflow.ellipsis,
),
)),
],
);
}).toList()
),
);
}
}
使用高德api定位获取地理位置:
使用第三方库:amap_location
配置:https://pub.dev/packages/amap_location#-readme-tab-
import 'package:flutter/material.dart';
import 'package:amap_location/amap_location.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
_DetailPageState({this.arguments});
@override
void initState() {
super.initState();
this.getLocation();
}
getLocation() async{
// 启动
await AMapLocationClient.startup(new AMapLocationOption( desiredAccuracy:CLLocationAccuracy.kCLLocationAccuracyHundredMeters ));
// 获取地理位置
var result = await AMapLocationClient.getLocation(true);
print("经度:${result.longitude}");
print("维度:${result.latitude}");
print("地理位置:${result.country},${result.district}");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('地理定位')
),
body: ListView(
children: [
],
)
);
}
}
4. 照相机拍照和相册选择 以及拍照上传到服务器
第三方库 image_picker
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:dio/dio.dart';
import 'package:fluttertoast/fluttertoast.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
var image;
_DetailPageState({this.arguments});
@override
void initState() {
super.initState();
}
takePhoto() async {
var image = await ImagePicker.pickImage(
source: ImageSource.camera,
maxWidth: 400
);
print("image ${image}");
this.setState(() {
this.image = image;
});
}
choicePhoto() async{
var image = await ImagePicker.pickImage(
source: ImageSource.gallery,
maxWidth: 400
);
this.setState(() {
this.image = image;
});
}
uploadPhoto(imgDir) async{
FormData formData = FormData.fromMap({
"file": await MultipartFile.fromFile(imgDir.path,filename: "upload.jpg")
});
var response = await Dio().post("http://jd.itying.com/imgupload",data: formData);
print("response ${response.data['success']}");
if (response.statusCode == 200) {
Fluttertoast.showToast(msg: '上传成功');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('照相机')
),
body: ListView(
children: [
RaisedButton(
child: Text('拍照'),
onPressed: this.takePhoto,
),
RaisedButton(
child: Text('选取照片'),
onPressed: this.choicePhoto,
),
RaisedButton(
child: Text('上传图片'),
onPressed: (){
this.uploadPhoto(this.image);
},
),
Container(
child: this.image == null ?
Text('清拍照')
:
Image.file(this.image)
,
)
],
)
);
}
}
5.Flutter视频播放
第三方库(chewie、video_player)
实例:
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
VideoPlayerController videoPlayerController;
ChewieController chewieController;
_DetailPageState({this.arguments});
@override
void initState() {
super.initState();
this.videoPlayerController = VideoPlayerController.network('https://rocketsystem.oss-cn-shanghai.aliyuncs.com/Course/Medias/106fa2617e6f499d9fbcadee42281a95_第一讲+本视频系列的初衷~1.mp4');
this.chewieController = ChewieController(
videoPlayerController: this.videoPlayerController,
aspectRatio: 3 / 2,
autoPlay: true,
looping: true
);
}
@override
void dispose() {
this.videoPlayerController.dispose();
this.chewieController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('照相机')
),
body: ListView(
children: [
Chewie(
controller: this.chewieController,
)
],
)
);
}
}
6. 本地存储 封装本地存储类
使用第三方库 shared_preferences
实例:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
_DetailPageState({this.arguments});
onSave() async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.setString("username", "张三");
}
getData() async{
SharedPreferences sp = await SharedPreferences.getInstance();
String username = sp.getString("username");
print("username $username");
}
removeData() async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.remove("username");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('照相机')
),
body: ListView(
children: [
RaisedButton(
child: Text('保存数据'),
onPressed: this.onSave,
),
RaisedButton(
child: Text('获取数据'),
onPressed: this.getData,
),
RaisedButton(
child: Text('移除数据'),
onPressed: this.removeData,
)
],
)
);
}
}
简单封装:
import 'package:shared_preferences/shared_preferences.dart';
class Storage {
static Future<void> setString(key, value) async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.setString(key, value);
}
static Future<String> getString(key) async{
SharedPreferences sp = await SharedPreferences.getInstance();
return sp.getString(key);
}
}
7. 检测网络连接
第三方包 connectivity
实例:
import 'package:flutter/material.dart';
import 'package:connectivity/connectivity.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
var subscription;
_DetailPageState({this.arguments});
@override
initState() {
super.initState();
subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
if (result == ConnectivityResult.wifi) {
print('手机wifi在线');
} else if (result == ConnectivityResult.mobile) {
print('手机网络在线');
} else if (result == ConnectivityResult.none) {
print('手机无网络');
}
});
}
@override
dispose() {
super.dispose();
subscription.cancel();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('网络')
),
body: ListView(
children: [
]
)
);
}
}
8. 扫码(二维码、条形码)
第三方 barcode_scan
实例:
import 'package:flutter/material.dart';
import 'package:barcode_scan/barcode_scan.dart';
class DetailPage extends StatefulWidget {
Map arguments;
DetailPage({Key key, this.arguments}) : super(key: key);
@override
_DetailPageState createState() => _DetailPageState(arguments: this.arguments);
}
class _DetailPageState extends State<DetailPage> {
Map arguments;
String scanContent = '等待扫码';
_DetailPageState({this.arguments});
Future scan() async {
var barcode = await BarcodeScanner.scan();
this.setState(() {
this.scanContent = barcode.rawContent;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('扫码')
),
body: ListView(
children: [
RaisedButton.icon(
icon: Icon(Icons.photo_camera),
label: Text('扫码'),
onPressed: this.scan
),
Text(this.scanContent)
]
)
);
}
}
9. 检测应用版本号、服务器下载文件以及实现App自动升级、安装
(1)获取本地版本号
(2)请求服务器获取服务器版本号
(3)本地版本和服务器版本不一致提示升级,弹框提示更新
(4)用户确定升级,调用文件传输方式下载apk文件
(5)监听下载速度
(6)下载完成打卡apk进行安装
注意:Ios没有办法直接下载,需要跳转到IOS应用对应的应用市场
Android升级app涉及的库:
package_info 检测版本号
path_provider 获取文件存储路径
flutter_downloader 下载新的apk
open_file 打开文件插件
实例:
import 'package:flutter/material.dart';
import 'package:package_info/package_info.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'dart:io';
import 'package:open_file/open_file.dart';
class MyFirstPagePage extends StatefulWidget {
Map arguments;
MyFirstPagePage({Key key, this.arguments}) : super(key: key);
@override
_MyFirstPagePageState createState() =>
_MyFirstPagePageState(arguments: this.arguments);
}
class _MyFirstPagePageState extends State<MyFirstPagePage> {
Map arguments;
_MyFirstPagePageState({this.arguments});
@override
void initState() {
super.initState();
this._getPackageInfo();
this._getAppPath();
this._initDownload();
}
_initDownload() async{
WidgetsFlutterBinding.ensureInitialized();
await FlutterDownloader.initialize(
debug: true // optional: set false to disable printing logs to console
);
}
_getPackageInfo() async{
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String appName = packageInfo.appName;
String packageName = packageInfo.packageName;
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;
print("appName:${appName}");
print("packageName:${packageName}");
print("version:${version}");
print("buildNumber:${buildNumber}");
}
_getAppPath() async{
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
var directory = await getExternalStorageDirectory();
String storageDirectory=directory.path;
print("tempPath:${tempPath}");
print("appDocDir:${appDocPath}");
print("StorageDirectory:${storageDirectory}");
}
_downLoad() async{
final directory = await getExternalStorageDirectory();
String _localPath = directory.path;
final taskId = await FlutterDownloader.enqueue(
url: "http://www.ionic.wang/jdshop.apk",
savedDir: _localPath,
showNotification:
true,
openFileFromNotification:
true,
);
//打开文件
OpenFile.open("${_localPath}/jdshop.apk");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(''),
),
body: Center(
child: Column(
children: [
RaisedButton.icon(
icon: Icon(Icons.arrow_downward),
label: Text('下载升级'),
onPressed: this._downLoad,
)
],
),
) // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
10. 打开外部浏览器 打开外部应用 拨打电话 发送短信
使用第三方包: url_launcher
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
class MyFirstPagePage extends StatefulWidget {
Map arguments;
MyFirstPagePage({Key key, this.arguments}) : super(key: key);
@override
_MyFirstPagePageState createState() =>
_MyFirstPagePageState(arguments: this.arguments);
}
class _MyFirstPagePageState extends State<MyFirstPagePage> {
Map arguments;
_MyFirstPagePageState({this.arguments});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(''),
),
body: Center(
child: Column(
children: [
RaisedButton(
child: Text('打开外部链接'),
onPressed: () async{
const url = 'https://flutter.cn';
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
},
),
RaisedButton(
child: Text('拨打电话'),
onPressed: () async{
const tel = 'tel:13041895753';
if (await canLaunch(tel)) {
await launch(tel);
} else {
throw 'Could not launch $tel';
}
},
),
RaisedButton(
child: Text('发送短信'),
onPressed: () async{
const sms = 'sms:13041895753';
if (await canLaunch(sms)) {
await launch(sms);
} else {
throw 'Could not launch $sms';
}
},
),
RaisedButton(
child: Text('打开外部应用'),
onPressed: () async{
const url = 'weixin://';
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
},
),
RaisedButton(
child: Text('发送邮件'),
onPressed: () async{
const url = 'mailto:2957009914@qq.com';
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
},
)
],
),
) // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
11. 支付宝支付
第三方包 sy_flutter_alipay
实例:
import 'package:flutter/material.dart';
import 'package:sy_flutter_alipay/sy_flutter_alipay.dart';
import 'package:dio/dio.dart';
class MyFirstPagePage extends StatefulWidget {
Map arguments;
MyFirstPagePage({Key key, this.arguments}) : super(key: key);
@override
_MyFirstPagePageState createState() =>
_MyFirstPagePageState(arguments: this.arguments);
}
class _MyFirstPagePageState extends State<MyFirstPagePage> {
Map arguments;
_MyFirstPagePageState({this.arguments});
alipay() async{
var serverData = await Dio().get('http://agent.itying.com/alipay/');
// 签名后的订单信息
var payInfo = serverData.data;
var result = await SyFlutterAlipay.pay(
payInfo,
// 如果是IOS支付需要提供唯一的urlScheme
// urlScheme: 'wq'
);
print(result);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(''),
),
body: Center(
child: Column(
children: [
RaisedButton.icon(
onPressed: this.alipay,
icon: Icon(Icons.monetization_on),
label: Text('支付宝支付')
)
],
)
) // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
12. 微信支付
第三方包:sy_flutter_wechat
import 'package:flutter/material.dart';
import 'package:sy_flutter_wechat/sy_flutter_wechat.dart';
import 'package:dio/dio.dart';
import 'dart:convert';
class MyFirstPagePage extends StatefulWidget {
Map arguments;
MyFirstPagePage({Key key, this.arguments}) : super(key: key);
@override
_MyFirstPagePageState createState() =>
_MyFirstPagePageState(arguments: this.arguments);
}
class _MyFirstPagePageState extends State<MyFirstPagePage> {
Map arguments;
_MyFirstPagePageState({this.arguments});
@override
void initState() {
super.initState();
_register();
}
_register() async {
bool result = await SyFlutterWechat.register('wx5881fa2638a2ca60');
print("_register $result");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(''),
),
body: Center(
child: Column(
children: [
RaisedButton(
child: Text('分享文字'),
onPressed: () async {
bool res = await SyFlutterWechat.shareText('hello world',
shareType: SyShareType.session);
print('分享文字:' + res.toString());
},
),
RaisedButton(
child: Text('分享图片'),
onPressed: () async {
bool res = await SyFlutterWechat.shareImage(
'https://avatars0.githubusercontent.com/u/10024776',
shareType: SyShareType.timeline);
print('分享图片:' + res.toString());
},
),
RaisedButton(
child: Text('分享网页'),
onPressed: () async {
bool res = await SyFlutterWechat.shareWebPage(
'标题',
'描述',
'https://avatars0.githubusercontent.com/u/10024776',
'http://www.example.com',
shareType: SyShareType.session);
print('分享网页:' + res.toString());
},
),
RaisedButton(
child: Text('支付'),
onPressed: () async {
var apiUrl='http://agent.itying.com/wxpay/';
var myPayInfo =await Dio().get(apiUrl);
Map myInfo =json.decode(myPayInfo.data);
print(myInfo);
var payInfo={
"appid":myInfo["appid"].toString(),
"partnerid":myInfo["partnerid"].toString(),
"prepayid":myInfo["prepayid"].toString(),
"package":myInfo["package"].toString(),
"noncestr":myInfo["noncestr"].toString(),
"timestamp":myInfo["timestamp"].toString(),
"sign":myInfo["sign"].toString(),
};
SyPayResult payResult = await SyFlutterWechat.pay(
SyPayInfo.fromJson(payInfo));
print("payResult $payResult");
},
),
],
)
) // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
13. Provider的使用
(1)新建Provider文件夹,在此文件夹下新建Counter.dart
import 'package:flutter/material.dart';
class Counter with ChangeNotifier{
int count = 1;
int get getCount => count; // 获取状态
incCount(count) {
this.count = count;
notifyListeners(); // 表示更新状态
}
}
(2)在main.dart中修改:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'provider/Counter.dart';
import 'routes.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(builder: (_) => Counter())
],
child: MaterialApp(
title: '京东商城',
initialRoute: '/',
debugShowCheckedModeBanner: false,
onGenerateRoute: onGenerateRoute,
theme: ThemeData(
primaryColor: Colors.white
),
),
);
}
}
(3)页面中使用
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../provider/Counter.dart';
class Cart extends StatefulWidget {
@override
_CartState createState() => _CartState();
}
class _CartState extends State<Cart> with AutomaticKeepAliveClientMixin{
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
var CounterProvider = Provider.of<Counter>(context);
return Scaffold(
body: Container(
child: Center(
child: Column(
children: <Widget>[
Text("${CounterProvider.getCount}"),
RaisedButton(
onPressed: (){
CounterProvider.incCount(5);
},
child: Text('点击'),
)
],
),
),
),
);
}
}
14. 事件广播 事件监听 event_bus
(1)新建EventBus.dart
import 'package:event_bus/event_bus.dart';
EventBus eventBus = EventBus();
class ProductDetailEvent{
String str;
ProductDetailEvent(String str){
this.str = str;
}
}
(2)监听事件
import 'EventBus.dart';
// 监听ProductDetailEvent广播
this.eventAction = eventBus.on<ProductDetailEvent>().listen((event){
print("event ${event.str}");
this.attrBottomSheet();
});
// 组件销毁时要取消事件监听
@override
void dispose() {
super.dispose();
// 取消事件监听
this.eventAction.cancel();
}
(3)触发事件
RasiedButton(
onPress(){
// 广播
eventBus.fire(ProductDetailEvent('加入购物车'));
}
)
flutter 高级
最新推荐文章于 2025-05-25 21:20:40 发布