Skip to content
代码片段 群组 项目
提交 0c8813cb 编辑于 作者: Neil Wang's avatar Neil Wang
浏览文件

refactor: #845 projectPage using ProjectProvider

上级 eba724f1
No related branches found
No related tags found
无相关合并请求
......@@ -3,17 +3,16 @@ import 'package:jihu_gitlab_app/core/id.dart';
class Project {
int id;
String name;
String nameWithNamespace;
String path;
String pathWithNamespace;
Project._(this.id, this.name, this.nameWithNamespace, this.path, this.pathWithNamespace);
Project._(this.id, this.name, this.path, this.pathWithNamespace);
factory Project.fromJson(Map<String, dynamic> json) {
return Project._(json['id'] ?? 0, json['name'] ?? '', json['name_with_namespace'] ?? '', json['path'] ?? '', json['path_with_namespace'] ?? '');
return Project._(json['id'] ?? 0, json['name'] ?? '', json['path'] ?? '', json['path_with_namespace'] ?? '');
}
factory Project.fromGraphQLJson(Map<String, dynamic> json) {
return Project._(json['id'] != null ? Id.fromGid(json['id'] ?? '/0').id : 0, json['name'] ?? '', json['nameWithNamespace'] ?? '', json['path'] ?? '', json['fullPath'] ?? '');
return Project._(json['id'] != null ? Id.fromGid(json['id'] ?? '/0').id : 0, json['name'] ?? '', json['path'] ?? '', json['fullPath'] ?? '');
}
}
import 'package:flutter/cupertino.dart';
import 'package:jihu_gitlab_app/core/domain/project.dart';
class ProjectProvider extends ChangeNotifier {
static ProjectProvider _instance = ProjectProvider._internal();
Project? project;
String? specifiedHost;
ProjectProvider._internal();
factory ProjectProvider() => _instance;
@visibleForTesting
fullReset() {
_instance = ProjectProvider._internal();
}
}
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/core/layout/adaptive.dart';
import 'package:jihu_gitlab_app/core/project_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/common_app_bar.dart';
import 'package:jihu_gitlab_app/modules/issues/index.dart';
import 'package:jihu_gitlab_app/modules/issues/list/issues_page.dart';
import 'package:jihu_gitlab_app/modules/projects/group_details/issues/project_issues_page.dart';
import 'package:jihu_gitlab_app/modules/projects/group_details/iterations/projects_iterations_page.dart';
import 'package:jihu_gitlab_app/modules/projects/group_details/mrs/project_merge_request_page.dart';
import 'package:jihu_gitlab_app/modules/projects/group_details/project/project_title_tab_bar_view.dart';
import 'package:jihu_gitlab_app/modules/projects/group_details/iterations/projects_iterations_page.dart';
import 'package:jihu_gitlab_app/modules/projects/repository/project_repository_page.dart';
import 'package:provider/provider.dart';
class ProjectPage extends StatefulWidget {
static const String routeName = 'ProjectIssuesPage';
......@@ -49,39 +51,46 @@ class _ProjectPageState extends State<ProjectPage> with TickerProviderStateMixin
}
Widget _buildBody() {
return Scaffold(
appBar: _buildAppBar(),
body: SafeArea(
child: Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
flexibleSpace: Padding(
padding: const EdgeInsets.only(left: 10),
child: ProjectTitleTabBarView(tabController: _tabController),
),
),
body: TabBarView(
controller: _tabController,
children: [
ProjectRepositoryPage(fullPath: widget.arguments['relativePath'], destinationHost: widget.arguments['destinationHost'], projectName: widget.arguments["name"]),
ProjectIssuesPage(
refreshKey: _refreshKey,
projectId: _projectId,
relativePath: widget.arguments['relativePath'],
destinationHost: widget.arguments['destinationHost'],
onSelectedIssueChange: isDesktopLayout(context) ? (index, params) => setState(() => _selectedItemParams = params) : null,
return MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => ProjectProvider())],
child: Consumer<ProjectProvider>(builder: (context, _, child) {
return Scaffold(
appBar: _buildAppBar(),
body: SafeArea(
child: Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
flexibleSpace: Padding(
padding: const EdgeInsets.only(left: 10),
child: ProjectTitleTabBarView(tabController: _tabController),
),
),
ProjectMergeRequestPage(arguments: {'relativePath': widget.arguments['relativePath'], 'destinationHost': widget.arguments['destinationHost']}),
ProjectsIterationsPage(fullPath: widget.arguments['relativePath'], destinationHost: widget.arguments['destinationHost'])
],
),
),
));
body: TabBarView(
controller: _tabController,
children: [
ProjectRepositoryPage(fullPath: widget.arguments['relativePath'], destinationHost: destinationHost(), projectName: widget.arguments["name"]),
ProjectIssuesPage(
refreshKey: _refreshKey,
projectId: _projectId,
relativePath: widget.arguments['relativePath'],
destinationHost: destinationHost(),
onSelectedIssueChange: isDesktopLayout(context) ? (index, params) => setState(() => _selectedItemParams = params) : null,
),
ProjectMergeRequestPage(arguments: {'relativePath': widget.arguments['relativePath'], 'destinationHost': destinationHost()}),
ProjectsIterationsPage(fullPath: widget.arguments['relativePath'], destinationHost: destinationHost())
],
),
),
));
}),
);
}
String? destinationHost() => ProjectProvider().specifiedHost ?? widget.arguments['destinationHost'];
AppBar _buildAppBar() {
return CommonAppBar(title: Text(widget.arguments['name']), showLeading: _showLeading, actions: [
if (widget.arguments['destinationHost'] == null)
if (destinationHost() == null)
Padding(
padding: const EdgeInsets.all(10),
child: IconButton(
......
......@@ -4,6 +4,7 @@ import 'package:jihu_gitlab_app/core/connection_provider/connection_provider.dar
import 'package:jihu_gitlab_app/core/dependency_injector.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/project_provider.dart';
import 'package:jihu_gitlab_app/core/system_version_detector.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar_and_name.dart';
......@@ -181,6 +182,7 @@ Future<void> main() async {
tearDown(() async {
ConnectionProvider().fullReset();
ProjectProvider().fullReset();
locator.unregister<IssueDetailsModel>();
});
}
......@@ -5,6 +5,7 @@ import 'package:jihu_gitlab_app/core/db_manager.dart';
import 'package:jihu_gitlab_app/core/dependency_injector.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/project_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/photo_picker.dart';
import 'package:jihu_gitlab_app/core/widgets/tips_view.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
......@@ -85,7 +86,7 @@ void main() {
tearDown(() async {
ConnectionProvider().fullReset();
ProjectProvider().fullReset();
locator.unregister<SubgroupListModel>();
locator.unregister<ProjectsGroupsModel>();
locator.unregister<ProjectsStarredModel>();
......
......@@ -5,6 +5,7 @@ import 'package:jihu_gitlab_app/core/dependency_injector.dart';
import 'package:jihu_gitlab_app/core/local_storage.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/project_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/tips_view.dart';
import 'package:jihu_gitlab_app/modules/issues/details/models/discussion/discussion.dart';
import 'package:jihu_gitlab_app/modules/issues/details/models/issue_details_model.dart';
......@@ -74,7 +75,6 @@ void main() {
group('Sub Groups List Page', () {
testWidgets('Should display No Data View', (WidgetTester tester) async {
ConnectionProvider().reset(Tester.jihuLabUser());
ConnectionProvider().reset(Tester.jihuLabUser());
when(provider.loadFromLocal()).thenAnswer((_) => Future(() => []));
await tester.pumpWidget(MultiProvider(
......@@ -297,6 +297,8 @@ void main() {
expect(find.text('No matches for \'a\''), findsOneWidget);
ConnectionProvider().fullReset();
});
tearDown(() => ProjectProvider().fullReset());
});
}
......
......@@ -5,6 +5,7 @@ import 'package:jihu_gitlab_app/core/dependency_injector.dart';
import 'package:jihu_gitlab_app/core/local_storage.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/project_provider.dart';
import 'package:jihu_gitlab_app/core/stars_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/tips_view.dart';
import 'package:jihu_gitlab_app/modules/issues/details/models/issue_details_gq_request_body.dart';
......@@ -56,6 +57,9 @@ void main() {
locator.unregister<ProjectsStarredModel>();
locator.unregister<IssueDetailsModel>();
reset(client);
ConnectionProvider().fullReset();
StarsProvider().fullReset();
ProjectProvider().fullReset();
});
testWidgets('Should display Default starred View when not logged in', (WidgetTester tester) async {
......@@ -77,7 +81,7 @@ void main() {
when(provider.loadFromLocal()).thenAnswer((_) => Future(() => []));
await tester.pumpWidget(
MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => ConnectionProvider())],
providers: [ChangeNotifierProvider(create: (context) => ConnectionProvider()), ChangeNotifierProvider(create: (context) => ProjectProvider())],
child: MaterialApp(
onGenerateRoute: onGenerateRoute,
home: const Scaffold(
......@@ -107,8 +111,6 @@ void main() {
expect(find.text("Draft: Resolve \"Hotfix: 待办列表翻页灰屏\""), findsOneWidget);
await tester.tap(find.text("Draft: Resolve \"Hotfix: 待办列表翻页灰屏\""));
await tester.pumpAndSettle();
ConnectionProvider().fullReset();
StarsProvider().fullReset();
});
testWidgets('Should display Default Starred View when not logged in 2', (WidgetTester tester) async {
......@@ -131,7 +133,7 @@ void main() {
when(provider.loadFromLocal()).thenAnswer((_) => Future(() => []));
await tester.pumpWidget(
MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => ConnectionProvider())],
providers: [ChangeNotifierProvider(create: (context) => ConnectionProvider()), ChangeNotifierProvider(create: (context) => ProjectProvider())],
child: MaterialApp(
onGenerateRoute: onGenerateRoute,
home: const Scaffold(
......@@ -161,8 +163,6 @@ void main() {
expect(find.text("Draft: Resolve \"Hotfix: 待办列表翻页灰屏\""), findsOneWidget);
await tester.tap(find.text("Draft: Resolve \"Hotfix: 待办列表翻页灰屏\""));
await tester.pumpAndSettle();
ConnectionProvider().fullReset();
StarsProvider().fullReset();
});
testWidgets('Should display Empty View when logged in with empty data', (WidgetTester tester) async {
......@@ -177,6 +177,7 @@ void main() {
providers: [
ChangeNotifierProvider(create: (context) => ConnectionProvider()),
ChangeNotifierProvider(create: (context) => StarsProvider()),
ChangeNotifierProvider(create: (context) => ProjectProvider())
],
child: const MaterialApp(
home: Scaffold(
......@@ -187,10 +188,6 @@ void main() {
expect(find.byType(ProjectsStarredPage), findsOneWidget);
expect(find.byType(TipsView), findsOneWidget);
ConnectionProvider().fullReset();
StarsProvider().fullReset();
});
testWidgets('Should display List View when logged in with data', (WidgetTester tester) async {
......@@ -203,26 +200,20 @@ void main() {
when(provider.loadFromLocal()).thenAnswer((_) => Future(() => starredProjects));
when(client.get<List<dynamic>>('/users/9527/starred_projects?page=1&per_page=50')).thenAnswer((_) => Future(() => Response.of<List<dynamic>>(starredProjects)));
HttpClient.injectInstanceForTesting(client);
await tester.pumpWidget(
MultiProvider(providers: [ChangeNotifierProvider(create: (context) => ConnectionProvider())], child: const MaterialApp(home: Scaffold(body: ProjectsStarredPage()))),
MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => ConnectionProvider()), ChangeNotifierProvider(create: (context) => ProjectProvider())],
child: const MaterialApp(home: Scaffold(body: ProjectsStarredPage()))),
);
await tester.pumpAndSettle();
expect(find.byType(ProjectsStarredPage), findsOneWidget);
expect(find.byType(ListView), findsOneWidget);
expect(find.byIcon(Icons.star_rounded), findsNWidgets(2));
expect(find.text("上线审批组"), findsOneWidget);
expect(find.text("API"), findsOneWidget);
await tester.tap(find.byIcon(Icons.star_rounded).first);
starredProjects.removeAt(0);
await tester.pumpAndSettle();
expect(find.byIcon(Icons.star_rounded), findsNWidgets(1));
ConnectionProvider().fullReset();
StarsProvider().fullReset();
});
}
......@@ -6,6 +6,7 @@ import 'package:jihu_gitlab_app/core/dependency_injector.dart';
import 'package:jihu_gitlab_app/core/local_storage.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/project_provider.dart';
import 'package:jihu_gitlab_app/generated/l10n.dart';
import 'package:jihu_gitlab_app/l10n/current_locale.dart';
import 'package:jihu_gitlab_app/modules/home/language_settings_page.dart';
......@@ -58,7 +59,11 @@ void main() {
Widget buildWidget(String routeName, params) {
return MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => ConnectionProvider()), ChangeNotifierProvider(create: (context) => LocaleProvider())],
providers: [
ChangeNotifierProvider(create: (context) => ConnectionProvider()),
ChangeNotifierProvider(create: (context) => LocaleProvider()),
ChangeNotifierProvider(create: (context) => ProjectProvider())
],
child: MaterialApp(
onGenerateRoute: onGenerateRoute,
home: Scaffold(body: Builder(builder: (BuildContext context) {
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册