Commit 4b0b3360 authored by 朱翠翠's avatar 朱翠翠

Merge branch 'test' of http://git.wanmeizhensuo.com/linshengyu/gm_flutter into zcc/flutter

 Conflicts:
	lib/ClueModel/ClueRouter.dart
	lib/ClueModel/ClueRouterImpl.dart
	lib/ClueModel/server/api/ClueApi.dart
	lib/ClueModel/server/api/ClueApi.serv.dart
	lib/main.dart
parents f4082c9c 54cb8cd7
......@@ -3,6 +3,7 @@
* @date 2020/6/24
**/
import 'package:flutter/widgets.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_common/Annotations/RouterBaser.dart';
import 'package:flutter_common/Annotations/anno/Router.dart';
import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart';
......@@ -10,4 +11,8 @@ import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart';
@Router("ClueRouter", ClueRouterImpl, true)
abstract class ClueRouter implements RouterBaser {
Widget getProjectDetailsPage();
@Router("ClueRouter",ClueRouterImpl,true)
abstract class ClueRouter implements RouterBaser{
Widget getLevelOnePage();
}
......@@ -5,6 +5,7 @@
import 'package:flutter/src/widgets/framework.dart';
import 'package:gm_flutter/ClueModel/ClueRouter.dart';
import 'package:gm_flutter/ClueModel/page/ProjectDetails/ProjectDetailsPage.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOnePage.dart';
class ClueRouterImpl implements ClueRouter {
@override
......@@ -12,3 +13,9 @@ class ClueRouterImpl implements ClueRouter {
return ProjectDetailsPage();
}
}
class ClueRouterImpl implements ClueRouter {
@override
Widget getLevelOnePage() {
return LevelOnePage();
}
}
/*
* @author lsy
* @date 2020-01-02
**/
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_common/flutter_common.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
class MessageBarView extends StatelessWidget {
final LiveData<int> topIndexLive;
final LiveData<double> topScrollLive;
final PageController pageController;
bool leftShow = false;
bool rightShow = false;
MessageBarView({
this.topIndexLive,
this.topScrollLive,
this.pageController,
}) {}
@override
Widget build(BuildContext context) {
return topView(context);
}
Widget topViewItem(String text, int index) {
return StreamBuilder(
stream: topIndexLive.stream,
initialData: topIndexLive.data ?? 0.0,
builder: (con, data) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
// pageController.jumpToPage(index);
pageController.animateToPage(index,
duration: Duration(milliseconds: 200), curve: Curves.ease);
},
child: Container(
alignment: Alignment.bottomCenter,
width: double.maxFinite,
height: double.maxFinite,
child: baseText(text, 16,
data.data == index ? Color(0xff282828) : Color(0xffB5B5B5)),
),
);
},
);
}
Widget topView(BuildContext context) {
return Container(
height: 49,
width: double.maxFinite,
child: Column(
children: <Widget>[
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Expanded(child: topViewItem("价格", 0)),
Expanded(child: topViewItem("医院", 1)),
Expanded(child: topViewItem("医生", 2)),
Expanded(child: topViewItem("评价", 3)),
],
),
),
Container(
alignment: Alignment.topLeft,
height: 8,
margin: EdgeInsets.only(top: 4, bottom: 5),
width: double.maxFinite,
child: StreamBuilder(
stream: topScrollLive.stream,
initialData: topScrollLive.data ?? 0.0,
builder: (con, data) {
return Container(
margin: EdgeInsets.only(
left: MediaQuery.of(context).size.width / 12 +
4.5 +
data.data),
width: 22,
height: 3,
decoration: BoxDecoration(
borderRadius: new BorderRadius.circular((1.5)),
color: Color(0xff3FB5AF),
),
);
},
),
)
],
),
);
}
}
/*
* @author lsy
* @date 2020/6/29
**/
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/ClueModel/view/FiveStarView.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseUtil.dart';
class LevelOneItem extends StatelessWidget {
final Cards cards;
VoidCallback lowPrice;
VoidCallback ask;
LevelOneItem(this.cards, {this.lowPrice, this.ask});
@override
Widget build(BuildContext context) {
if (cards.cardType == "plan") {
return PlanItem(context);
} else if (cards.cardType == "hospital") {
return HospitalItem(context);
}
}
Widget DoctorItem(BuildContext context) {
if (cards.doctor == null && isDebug) {
throw new Exception();
}
return GestureDetector(
child: Container(
margin: EdgeInsets.only(left: 15, right: 15),
height: 127,
child: Stack(
children: <Widget>[
Positioned(
top: 15,
child: Container(
width: 45,
height: 45,
child: ClipOval(
child: CachedNetworkImage(
imageUrl: cards.doctor.portrait,
),
),
),
),
Positioned(
left: 57,
top: 18,
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
baseText(cards.doctor.name, 15, Color(0xff333333),
bold: true),
Container(
margin: EdgeInsets.only(left: 4),
child: baseText(cards.doctor.name, 15, Color(0xff333333),
bold: true),
)
],
),
),
Positioned(
top: 42,
right: 0,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)),
baseText("${cards.doctor.minPrice}-${cards.doctor.maxPrice}",
15, Color(0xffFF5963)),
],
),
),
Positioned(
bottom: 15,
right: 0,
child: lowPriceWidget(),
),
Positioned(
bottom: 15,
right: 187,
child: askWidget(),
),
Positioned(
left: 4.5,
bottom: 25,
child: compareWidget(),
),
],
),
),
);
}
Widget HospitalItem(BuildContext context) {
if (cards.hospital == null && isDebug) {
throw new Exception();
}
return GestureDetector(
onTap: () {},
child: Container(
margin: EdgeInsets.only(left: 15, right: 15),
height: 149,
child: Stack(
children: <Widget>[
Positioned(
left: 0,
top: 15,
child: Container(
width: 45,
height: 45,
child: ClipOval(
child: CachedNetworkImage(
imageUrl: cards.hospital.portrait,
),
),
),
),
Positioned(
left: 57,
top: 17.5,
child: baseText(cards.hospital.name, 15, Color(0xff333333),
bold: true),
),
Positioned(
top: 42.5,
right: 0,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)),
baseText(
"${cards.hospital.minPrice}-${cards.hospital.maxPrice}",
15,
Color(0xffFF5963)),
],
),
),
Positioned(
bottom: 15,
right: 0,
child: lowPriceWidget(),
),
Positioned(
bottom: 15,
right: 187,
child: askWidget(),
),
Positioned(
left: 4.5,
bottom: 25,
child: compareWidget(),
),
Positioned(
bottom: 67,
left: 57,
child: baseText(cards.hospital.address, 12, Color(0xff666666)),
),
Positioned(
left: 57,
top: 43.5,
child: FiveStarView(cards.hospital.star, 5),
)
],
),
));
}
Widget PlanItem(BuildContext context) {
if (cards.plan == null && isDebug) {
throw new Exception();
}
return Container(
height: 118,
margin: EdgeInsets.only(left: 15, right: 15),
child: Stack(
children: <Widget>[
Positioned(
left: 0,
top: 15,
child: baseText(cards.plan.planName, 15, Color(0xff282828),
bold: true),
),
Positioned(
right: 0,
top: 15,
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)),
baseText(cards.plan.maxPrice, 15, Color(0xffFF5963))
],
),
),
Positioned(
left: 4.5,
bottom: 25,
child: compareWidget(),
),
Positioned(bottom: 15, right: 0, child: lowPriceWidget()),
Positioned(
right: 152,
bottom: 15,
child: askWidget(),
),
Positioned(
top: 40,
right: 0,
child: baseText(
"指导价:¥${cards.plan.minPrice}-${cards.plan.maxPrice}",
11,
Color(0xff666666)),
),
Positioned(
left: 15,
bottom: 0,
child: Container(
width: MediaQuery.of(context).size.width - 30,
height: 0.5,
color: Color(0xffE5E5E5),
),
)
],
),
);
}
Widget lowPriceWidget() {
return GestureDetector(
onTap: lowPrice,
behavior: HitTestBehavior.opaque,
child: Container(
width: 122,
height: 37,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(18.5),
color: Color(0xffFFF5F5)),
alignment: Alignment.center,
child: baseText("获取底价", 14, Color(0xffFF5963), bold: true),
),
);
}
Widget askWidget() {
return GestureDetector(
onTap: ask,
behavior: HitTestBehavior.opaque,
child: Container(
width: 122,
height: 37,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(18.5),
color: Color(0xffEEFDFD)),
alignment: Alignment.center,
child: baseText("咨询", 14, Color(0xff3FB5AF), bold: true),
),
);
}
Widget compareWidget() {
return Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
width: 18,
height: 18,
child: Image.asset("assets/vs.png"),
),
Container(
margin: EdgeInsets.only(left: 1.5),
child: baseText("去比较", 13, Color(0xff282828), bold: true),
)
],
);
}
}
/*
* @author lsy
* @date 2020/6/29
**/
import 'package:flutter/material.dart';
import 'package:flutter_common/commonModel/live/BaseModel.dart';
import 'package:flutter_common/commonModel/live/LiveData.dart';
import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class LevelOneModel extends BaseModel {
LiveData<double> appBarLive = LiveData();
LiveData<List<String>> rectLive = LiveData();
LiveData<List<String>> explainLive = LiveData();
LiveData<bool> showTab = LiveData();
LiveData<int> topIndexLive = new LiveData();
LiveData<double> topScrollLive = new LiveData();
LiveData<bool> loadingLive = LiveData();
RxDispose rxDispose = RxDispose();
LiveData<Pair<int, List<Cards>>> cardsLive = LiveData();
Map<int, List<Cards>> data = new Map();
List list = ["plan", "hospital", "doctor", "diary"];
List pageList = [1, 1, 1, 1];
List pageHeightList = [118, 149, 118, 118];
void refreshView(bool clear, {RefreshController refreshListener}) {
Future.delayed(Duration(seconds: 1), () {
Cards cards = Cards(
cardType: "plan",
plan: Plan(planName: "ww", minPrice: "50", maxPrice: "500"));
List<Cards> a = [
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
];
List<Cards> b = [cards];
print("INDEX ${currentIndex}");
if (currentIndex == 1) {
data[currentIndex] = b;
} else {
data[currentIndex] = a;
}
cardsLive.notifyView(Pair(ENDLOADING, data));
});
// int index = currentIndex;
// if (clear) {
// data.clear();
// pageList = [1, 1, 1, 1];
// }
// ClueApiImpl.getInstance()
// .getLevelOneList(
// DioUtil.getInstance().getDio(), 123, list[index], pageList[index])
// .listen((event) {})
// .addToDispose(rxDispose)
// .onError((err) {});
}
int currentIndex = 0;
@override
void dispose() {
showTab.dispost();
cardsLive.dispost();
appBarLive.dispost();
rectLive.dispost();
topIndexLive.dispost();
topScrollLive.dispost();
loadingLive.dispost();
}
void selectPage(int index) {
if (currentIndex == index) {
return;
}
currentIndex = index;
if (data[currentIndex] == null) {
cardsLive.notifyView(Pair(LOADING, null));
refreshView(true);
} else {
cardsLive.notifyView(Pair(ENDLOADING, data[currentIndex]));
}
}
void loadMore() {}
}
......@@ -6,9 +6,14 @@ import 'package:flutter_common/Annotations/anno/Get.dart';
import 'package:flutter_common/Annotations/anno/Query.dart';
import 'package:flutter_common/Annotations/anno/ServiceCenter.dart';
import 'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
@ServiceCenter()
abstract class ClueApi {
@Get("/api/janus/plans/<:plan_id>/detail")
ProjectDetailsItem getProjectDetails(@Query("plan_id") int plan_id);
abstract class ClueApi {
@Get("api/janus/plans/plan_feed")
LevelOneFeedList getLevelOneList(@Query("plan_id") int plan_id,
@Query("tab_type") String tab_type, @Query("page") int page);
}
......@@ -16,6 +16,8 @@ import 'package:flutter/foundation.dart';
import 'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
const bool inProduction = const bool.fromEnvironment("dart.vm.product");
class ClueApiImpl {
......@@ -47,6 +49,23 @@ class ClueApiImpl {
});
}
Stream<LevelOneFeedList> getLevelOneList(
Dio _dio, int plan_id, String tab_type, int page) {
return Stream.fromFuture(get(_dio, 'api/janus/plans/plan_feed', data: {
'plan_id': plan_id,
'tab_type': tab_type,
'page': page,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parseLevelOneFeedList, value.toString()));
} else {
throw Exception("--未知网络错误--");
}
});
}
///==================base method==================
Future<Response> get(Dio _dio, url, {data, options, cancelToken}) async {
......@@ -184,6 +203,10 @@ class ClueApiImpl {
}
}
LevelOneFeedList parseLevelOneFeedList(String value) {
return LevelOneFeedList.fromJson(json.decode(value));
}
ProjectDetailsItem parseProjectDetailsItem(String value) {
return ProjectDetailsItem.fromJson(json.decode(value));
}
This diff is collapsed.
/*
* @author lsy
* @date 2020/6/30
**/
import 'package:flutter/cupertino.dart';
class PosUtil {
static Offset findPos(GlobalKey globalKey) {
Offset offset;
if (globalKey.currentContext != null) {
RenderBox box = globalKey.currentContext.findRenderObject();
offset = box.localToGlobal(Offset.zero);
}
return offset;
}
}
/*
* @author lsy
* @date 2020/6/29
**/
import 'package:flutter/cupertino.dart';
class FiveStarView extends StatelessWidget {
final int allStarCount;
final int lightStarCount;
FiveStarView(this.lightStarCount, this.allStarCount);
@override
Widget build(BuildContext context) {
List<Widget> list = new List();
for (int i = 0; i < allStarCount; i++) {
if (i <= lightStarCount) {
list.add(Container(
height: 13,
width: 13,
child: Image.asset("assets/sel_star.png"),
));
if (i != 0 && i != allStarCount - 1) {
list.add(Container(
height: 1,
width: 2,
));
}
} else {
list.add(Container(
height: 13,
width: 13,
child: Image.asset("assets/normal_star.png"),
));
if (i != 0 && i != allStarCount - 1) {
list.add(Container(
height: 1,
width: 2,
));
}
}
}
return Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: list,
);
}
}
......@@ -10,4 +10,6 @@ import 'MainRouterImpl.dart';
@Router("MainRouter", MainRouterImpl, true)
abstract class MainRouter extends RouterBaser {
void init();
Widget getTestPage();
}
......@@ -4,6 +4,7 @@
**/
import 'package:flutter/src/widgets/framework.dart';
import 'package:gm_flutter/MainRouter/manager/MainManager.dart';
import 'package:gm_flutter/MainRouter/page/test/TestPage.dart';
import 'MainRouter.dart';
......@@ -12,4 +13,9 @@ class MainRouterImpl implements MainRouter {
void init() {
MainManager.getInstance().startInit();
}
@override
Widget getTestPage() {
return TestPage();
}
}
......@@ -8,6 +8,7 @@ import 'package:flutter_common/commonModel/util/JumpUtil.dart';
import 'package:gm_flutter/MainRouter/page/proxy/NetProxyPage.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseState.dart';
import 'package:gm_flutter/main.mark.dart';
import 'TP.dart';
......@@ -24,8 +25,8 @@ class TestState extends BaseState<TestPage> {
list.add(listItem("设置代理页面", () {
JumpUtil.jumpToPageRight(context, NetProxyPage());
}));
list.add(listItem("测试测试", () {
JumpUtil.jumpToPageRight(context, TP());
list.add(listItem("一级列表页", () {
JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getLevelOnePage());
}));
return list;
}
......@@ -40,7 +41,7 @@ class TestState extends BaseState<TestPage> {
Navigator.pop(context);
}),
body: Container(
child: Column(
child: ListView(
children: innerList(),
),
),
......
......@@ -9,4 +9,3 @@ export 'base/BaseUtil.dart';
export 'net/Api.dart';
export 'net/DioUtil.dart';
export 'picker/loadingPicker.dart';
export 'util/DartUtil.dart';
......@@ -5,10 +5,13 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_common/commonModel/eventbus/GlobalEventBus.dart';
import 'package:flutter_common/commonModel/view/iOSLoading.dart';
import 'package:flutter_svg/svg.dart';
import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/util/DartUtil.dart';
import 'package:gm_flutter/commonModel/view/ImagesAnimation.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
double SCREENWIDTH;
......@@ -25,9 +28,8 @@ AppBar baseAppBar(
double elevation = 0.0,
Widget titleWidget = null}) {
return _baseAppBarChangeTitle(
title: title == null
? Container()
: baseText(title, 16, Color(0xff323232)),
title:
title == null ? Container() : baseText(title, 16, Color(0xff323232)),
action: action,
centerTitle: centerTitle,
backClick: backClick,
......@@ -68,7 +70,7 @@ AppBar _baseAppBarChangeTitle(
width: 30,
height: 30,
child: Image.asset(
"images/left_arrow.png",
"assets/left_arrow.png",
color: Color(0xff323232),
),
))),
......@@ -248,8 +250,107 @@ Widget baseRedPoint(int num) {
alignment: Alignment.center,
width: 15,
height: 15,
decoration:
BoxDecoration(shape: BoxShape.circle, color: Color(0xffFF5963)),
decoration: BoxDecoration(shape: BoxShape.circle, color: Color(0xffFF5963)),
child: baseText("${num}", 11, Color(0xffFFFFFF)),
);
}
Widget baseRefreshView(RefreshController refreshController,
VoidCallback refresh, Widget topFix, Widget List,
{bool pullUp = false,
bool pullDown = true,
VoidCallback onLoading,
ScrollController scrollController,
CustomScrollView customScrollView}) {
return SmartRefresher(
enablePullDown: pullDown,
enablePullUp: pullUp,
onLoading: onLoading ?? () {},
header: normalRefreshHeader(),
controller: refreshController,
onRefresh: refresh,
footer: CustomFooter(
builder: (BuildContext context, LoadStatus mode) {
Widget body;
print("LOAD STATUE ${mode}");
if (mode == LoadStatus.idle) {
body = baseText("上拉加载更多", 12, Color(0xff545454));
} else if (mode == LoadStatus.loading) {
body = baseText("加载中", 12, Color(0xff545454));
} else if (mode == LoadStatus.failed) {
body = baseText("加载失败", 12, Color(0xff545454));
} else if (mode == LoadStatus.noMore) {
body = baseText("没有更多数据了", 12, Color(0xff545454));
}
else {
body = Container();
}
return Container(
height: 55.0,
child: Center(child: body),
);
},
),
child: customScrollView ??
CustomScrollView(
controller: scrollController,
slivers: <Widget>[
SliverToBoxAdapter(
child: topFix,
),
List,
],
));
}
Widget normalRefreshHeader() {
return CustomHeader(
builder: (BuildContext context, RefreshStatus mode) {
Widget body;
// if (mode == RefreshStatus.idle) {
//
// } else
if (mode == RefreshStatus.refreshing) {
body = ImagesAnimation(
w: 46,
h: 15,
durationSeconds: 1500,
entry: ImagesAnimationEntry(1, 20, "assets/ptr_header_loading"));
}
// else if (mode == RefreshStatus.failed) {
// body = Text("Load Failed!Click retry!");
// }
else {
body = Image.asset(
"assets/ptr_header_loading01.png",
width: 46,
height: 15,
);
}
return Container(
height: 55.0,
child: Center(child: body),
);
},
);
}
Widget emptyItem({String detail}) {
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 210,
width: 210,
color: Colors.red,
),
Container(
margin: EdgeInsets.only(top: 8),
child: baseText(
detail == null ? "暂无消息,找人聊聊去" : detail, 15, Color(0xff9B9B9B)),
),
],
);
}
......@@ -59,7 +59,8 @@ class MyApp extends State<MyAppWidget> {
return DemoPage1();
},
});
FlutterBoost.singleton.addBoostContainerLifeCycleObserver((state, settings) {
FlutterBoost.singleton
.addBoostContainerLifeCycleObserver((state, settings) {
print("LSY ${state}");
});
// FlutterBoost.singleton.addBoostNavigatorObserver(TestBoostNavigatorObserver());
......@@ -83,6 +84,19 @@ home: RouterCenterImpl().findClueRouter().getProjectDetailsPage(),
// ),
// )
);
theme: ThemeData(
primaryColor: Colors.white,
cursorColor: Color(0xff20BDBB),
canvasColor: Colors.white),
builder: FlutterBoost.init(postPush: _onRoutePushed),
home: isDebug
? RouterCenterImpl().findMainRouter().getTestPage()
: Container(
color: Colors.white,
child: Center(
child: loadingItem(),
),
));
}
void _onRoutePushed(
......
......@@ -3,7 +3,7 @@ description: A new flutter module project.
version: 1.0.0+1
environment:
sdk: ">=2.1.0 <3.0.0"
sdk: ">=2.6.0 <3.0.0"
dependencies:
flutter:
......@@ -32,6 +32,7 @@ dependencies:
#轻量级存储
shared_preferences: ^0.5.7+1
dev_dependencies:
flutter_test:
sdk: flutter
......@@ -40,7 +41,8 @@ dev_dependencies:
flutter:
uses-material-design: true
assets:
- assets/
module:
androidX: true
androidPackage: com.example.gm_flutter
......
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