您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
191 行
7.5 KiB
191 行
7.5 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using uiwidgets;
|
|
using UIWidgetsGallery.demo.shrine.model;
|
|
using Unity.UIWidgets.async;
|
|
using Unity.UIWidgets.cupertino;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.material;
|
|
using Unity.UIWidgets.scheduler;
|
|
using Unity.UIWidgets.ui;
|
|
using Unity.UIWidgets.widgets;
|
|
using UnityEngine;
|
|
|
|
namespace UIWidgetsGallery.gallery
|
|
{
|
|
public class GalleryApp : StatefulWidget
|
|
{ public GalleryApp(
|
|
Key key = null,
|
|
UpdateUrlFetcher updateUrlFetcher = null,
|
|
bool enablePerformanceOverlay = true,
|
|
bool enableRasterCacheImagesCheckerboard = true,
|
|
bool enableOffscreenLayersCheckerboard = true,
|
|
VoidCallback onSendFeedback = null,
|
|
bool testMode = false
|
|
) : base(key: key)
|
|
{
|
|
this.updateUrlFetcher = updateUrlFetcher;
|
|
this.enablePerformanceOverlay = enablePerformanceOverlay;
|
|
this.enableRasterCacheImagesCheckerboard = enableRasterCacheImagesCheckerboard;
|
|
this.enableOffscreenLayersCheckerboard = enableOffscreenLayersCheckerboard;
|
|
this.onSendFeedback = onSendFeedback;
|
|
this.testMode = testMode;
|
|
}
|
|
|
|
public readonly UpdateUrlFetcher updateUrlFetcher;
|
|
public readonly bool enablePerformanceOverlay;
|
|
public readonly bool enableRasterCacheImagesCheckerboard;
|
|
public readonly bool enableOffscreenLayersCheckerboard;
|
|
public readonly VoidCallback onSendFeedback;
|
|
public readonly bool testMode;
|
|
|
|
public override State createState()
|
|
{
|
|
return new _GalleryAppState();
|
|
}
|
|
}
|
|
|
|
internal class _GalleryAppState : State<GalleryApp>
|
|
{
|
|
private GalleryOptions _options;
|
|
private Timer _timeDilationTimer;
|
|
private AppStateModel model;
|
|
|
|
private Dictionary<string, WidgetBuilder> _buildRoutes()
|
|
{
|
|
Dictionary<string, WidgetBuilder> routeBulders = new Dictionary<string, WidgetBuilder>();
|
|
|
|
foreach (var demo in GalleryDemo.kAllGalleryDemos) routeBulders.Add(demo.routeName, demo.buildRoute);
|
|
|
|
return routeBulders;
|
|
}
|
|
|
|
private static readonly RuntimePlatform defaultTargetPlatform = RuntimePlatform.WindowsPlayer;
|
|
|
|
|
|
public override void initState()
|
|
{
|
|
base.initState();
|
|
this._options = new GalleryOptions(
|
|
themeMode: ThemeMode.system,
|
|
textScaleFactor: GalleryTextScaleValue.kAllGalleryTextScaleValues[0],
|
|
visualDensity: GalleryVisualDensityValue.kAllGalleryVisualDensityValues[0],
|
|
timeDilation: scheduler_.timeDilation,
|
|
platform: defaultTargetPlatform
|
|
);
|
|
this.model = new AppStateModel();
|
|
this.model.loadProducts();
|
|
}
|
|
|
|
public override void reassemble()
|
|
{
|
|
this._options = this._options.copyWith(platform: defaultTargetPlatform);
|
|
base.reassemble();
|
|
}
|
|
|
|
public override void dispose()
|
|
{
|
|
this._timeDilationTimer?.cancel();
|
|
this._timeDilationTimer = null;
|
|
base.dispose();
|
|
}
|
|
|
|
private void _handleOptionsChanged(GalleryOptions newOptions)
|
|
{
|
|
this.setState(() =>
|
|
{
|
|
if (this._options.timeDilation != newOptions.timeDilation)
|
|
{
|
|
this._timeDilationTimer?.cancel();
|
|
this._timeDilationTimer = null;
|
|
if (newOptions.timeDilation > 1.0f
|
|
) // We delay the time dilation change long enough that the user can see
|
|
// that UI has started reacting and then we slam on the brakes so that
|
|
// they see that the time is in fact now dilated.
|
|
this._timeDilationTimer = Timer.create(new TimeSpan(0, 0, 0, 0, 150),
|
|
() => { scheduler_.timeDilation = newOptions.timeDilation; });
|
|
else
|
|
scheduler_.timeDilation = newOptions.timeDilation;
|
|
}
|
|
|
|
this._options = newOptions;
|
|
});
|
|
}
|
|
|
|
private Widget _applyTextScaleFactor(Widget child)
|
|
{
|
|
return new Builder(
|
|
builder: (BuildContext context) =>
|
|
{
|
|
return new MediaQuery(
|
|
data: MediaQuery.of(context).copyWith(
|
|
textScaleFactor: this._options.textScaleFactor.scale
|
|
),
|
|
child: child
|
|
);
|
|
}
|
|
);
|
|
}
|
|
|
|
private static void defaultSendFeedback()
|
|
{
|
|
Debug.Log("hello UIWidgets !");
|
|
}
|
|
|
|
public override Widget build(BuildContext context)
|
|
{
|
|
Widget home = new GalleryHome(
|
|
testMode: this.widget.testMode,
|
|
optionsPage: new GalleryOptionsPage(
|
|
options: this._options,
|
|
onOptionsChanged: this._handleOptionsChanged,
|
|
onSendFeedback: this.widget.onSendFeedback ?? defaultSendFeedback
|
|
)
|
|
);
|
|
|
|
if (this.widget.updateUrlFetcher != null)
|
|
home = new Updater(
|
|
updateUrlFetcher: this.widget.updateUrlFetcher,
|
|
child: home
|
|
);
|
|
|
|
return new ScopedModel<AppStateModel>(
|
|
model: this.model,
|
|
child: new MaterialApp(
|
|
theme: GalleyThemes.kLightGalleryTheme.copyWith(platform: this._options.platform,
|
|
visualDensity: this._options.visualDensity.visualDensity),
|
|
darkTheme: GalleyThemes.kDarkGalleryTheme.copyWith(platform: this._options.platform,
|
|
visualDensity: this._options.visualDensity.visualDensity),
|
|
themeMode: this._options.themeMode.Value,
|
|
title: "Flutter Gallery",
|
|
color: Colors.grey,
|
|
showPerformanceOverlay: this._options.showPerformanceOverlay,
|
|
checkerboardOffscreenLayers: this._options.showOffscreenLayersCheckerboard,
|
|
checkerboardRasterCacheImages: this._options.showRasterCacheImagesCheckerboard,
|
|
routes: this._buildRoutes(),
|
|
builder: (BuildContext subContext, Widget child) =>
|
|
{
|
|
return new Directionality(
|
|
textDirection: this._options.textDirection.Value,
|
|
child: this._applyTextScaleFactor(
|
|
// Specifically use a blank Cupertino theme here and do not transfer
|
|
// over the Material primary color etc except the brightness to
|
|
// showcase standard iOS looks.
|
|
new Builder(builder: (BuildContext context1) =>
|
|
{
|
|
return new CupertinoTheme(
|
|
data: new CupertinoThemeData(
|
|
brightness: Theme.of(context1).brightness
|
|
),
|
|
child: child
|
|
);
|
|
})
|
|
)
|
|
);
|
|
},
|
|
home: home
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|