diff --git a/assets/fonts/Flamante-Roma-Medium.ttf b/assets/fonts/Flamante-Roma-Medium.ttf new file mode 100755 index 00000000..aa52ae4c Binary files /dev/null and b/assets/fonts/Flamante-Roma-Medium.ttf differ diff --git a/assets/fonts/Flamante-Roma-MediumItalic.ttf b/assets/fonts/Flamante-Roma-MediumItalic.ttf new file mode 100755 index 00000000..c9240e72 Binary files /dev/null and b/assets/fonts/Flamante-Roma-MediumItalic.ttf differ diff --git a/assets/fonts/Lato-Bold.ttf b/assets/fonts/Lato-Bold.ttf new file mode 100755 index 00000000..74343694 Binary files /dev/null and b/assets/fonts/Lato-Bold.ttf differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e4c7c203..bb4e86ed 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,9 +8,9 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 333E5DAE7FC10AC69FEC26C0 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DDA792F029EDD7A11295D192 /* libPods-Runner.a */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; @@ -40,8 +40,8 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -90,9 +90,9 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -209,8 +209,8 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/lib/common/icon_names.dart b/lib/common/icon_names.dart index 7d75b841..4700359d 100644 --- a/lib/common/icon_names.dart +++ b/lib/common/icon_names.dart @@ -7,8 +7,13 @@ * tartget: FlatButton 的示例 */ import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; class IconNames { static List names = [Icons.ac_unit,Icons.access_alarm,Icons.access_alarms,Icons.access_time,Icons.accessibility,Icons.accessibility_new,Icons.accessible,Icons.accessible_forward,Icons.account_balance,Icons.account_balance_wallet,Icons.account_box,Icons.account_circle,Icons.adb,Icons.add,Icons.add_a_photo,Icons.add_alarm,Icons.add_alert,Icons.add_box,Icons.add_call,Icons.add_circle,Icons.add_circle_outline,Icons.add_comment,Icons.add_location,Icons.add_photo_alternate,Icons.add_shopping_cart,Icons.add_to_home_screen,Icons.add_to_photos,Icons.add_to_queue,Icons.adjust,Icons.airline_seat_flat,Icons.airline_seat_flat_angled,Icons.airline_seat_individual_suite,Icons.airline_seat_legroom_extra,Icons.airline_seat_legroom_normal,Icons.airline_seat_legroom_reduced,Icons.airline_seat_recline_extra,Icons.airline_seat_recline_normal,Icons.airplanemode_active,Icons.airplanemode_inactive,Icons.airplay,Icons.airport_shuttle,Icons.alarm,Icons.alarm_add,Icons.alarm_off,Icons.alarm_on,Icons.album,Icons.all_inclusive,Icons.all_out,Icons.alternate_email,Icons.android,Icons.announcement,Icons.apps,Icons.archive,Icons.arrow_back,Icons.arrow_back_ios,Icons.arrow_downward,Icons.arrow_drop_down,Icons.arrow_drop_down_circle,Icons.arrow_drop_up,Icons.arrow_forward,Icons.arrow_forward_ios,Icons.arrow_left,Icons.arrow_right,Icons.arrow_upward,Icons.art_track,Icons.aspect_ratio,Icons.assessment,Icons.assignment,Icons.assignment_ind,Icons.assignment_late,Icons.assignment_return,Icons.assignment_returned,Icons.assignment_turned_in,Icons.assistant,Icons.assistant_photo,Icons.atm,Icons.attach_file,Icons.attach_money,Icons.attachment,Icons.audiotrack,Icons.autorenew,Icons.av_timer,Icons.backspace,Icons.backup,Icons.battery_alert,Icons.battery_charging_full,Icons.battery_full,Icons.battery_std,Icons.battery_unknown,Icons.beach_access,Icons.beenhere,Icons.block,Icons.bluetooth,Icons.bluetooth_audio,Icons.bluetooth_connected,Icons.bluetooth_disabled,Icons.bluetooth_searching,Icons.blur_circular,Icons.blur_linear,Icons.blur_off,Icons.blur_on,Icons.book,Icons.bookmark,Icons.bookmark_border,Icons.border_all,Icons.border_bottom,Icons.border_clear,Icons.border_color,Icons.border_horizontal,Icons.border_inner,Icons.border_left,Icons.border_outer,Icons.border_right,Icons.border_style,Icons.border_top,Icons.border_vertical,Icons.branding_watermark,Icons.brightness_1,Icons.brightness_2,Icons.brightness_3,Icons.brightness_4,Icons.brightness_5,Icons.brightness_6,Icons.brightness_7,Icons.brightness_auto,Icons.brightness_high,Icons.brightness_low,Icons.brightness_medium,Icons.broken_image,Icons.brush,Icons.bubble_chart,Icons.bug_report,Icons.build,Icons.burst_mode,Icons.business,Icons.business_center,Icons.cached,Icons.cake,Icons.calendar_today,Icons.calendar_view_day,Icons.call,Icons.call_end,Icons.call_made,Icons.call_merge,Icons.call_missed,Icons.call_missed_outgoing,Icons.call_received,Icons.call_split,Icons.call_to_action,Icons.camera,Icons.camera_alt,Icons.camera_enhance,Icons.camera_front,Icons.camera_rear,Icons.camera_roll,Icons.cancel,Icons.card_giftcard,Icons.card_membership,Icons.card_travel,Icons.casino,Icons.cast,Icons.cast_connected,Icons.category,Icons.center_focus_strong,Icons.center_focus_weak,Icons.change_history,Icons.chat,Icons.chat_bubble,Icons.chat_bubble_outline,Icons.check,Icons.check_box,Icons.check_box_outline_blank,Icons.check_circle,Icons.check_circle_outline,Icons.chevron_left,Icons.chevron_right,Icons.child_care,Icons.child_friendly,Icons.chrome_reader_mode,Icons.class_,Icons.clear,Icons.clear_all,Icons.close,Icons.closed_caption,Icons.cloud,Icons.cloud_circle,Icons.cloud_done,Icons.cloud_download,Icons.cloud_off,Icons.cloud_queue,Icons.cloud_upload,Icons.code,Icons.collections,Icons.collections_bookmark,Icons.color_lens,Icons.colorize,Icons.comment,Icons.compare,Icons.compare_arrows,Icons.computer,Icons.confirmation_number,Icons.contact_mail,Icons.contact_phone,Icons.contacts,Icons.content_copy,Icons.content_cut,Icons.content_paste,Icons.control_point,Icons.control_point_duplicate,Icons.copyright,Icons.create,Icons.create_new_folder,Icons.credit_card,Icons.crop,Icons.crop_3_2,Icons.crop_5_4,Icons.crop_7_5,Icons.crop_16_9,Icons.crop_din,Icons.crop_free,Icons.crop_landscape,Icons.crop_original,Icons.crop_portrait,Icons.crop_rotate,Icons.crop_square,Icons.dashboard,Icons.data_usage,Icons.date_range,Icons.dehaze,Icons.delete,Icons.delete_forever,Icons.delete_outline,Icons.delete_sweep,Icons.departure_board,Icons.description,Icons.desktop_mac,Icons.desktop_windows,Icons.details,Icons.developer_board,Icons.developer_mode,Icons.device_hub,Icons.device_unknown,Icons.devices,Icons.devices_other,Icons.dialer_sip,Icons.dialpad,Icons.directions,Icons.directions_bike,Icons.directions_boat,Icons.directions_bus,Icons.directions_car,Icons.directions_railway,Icons.directions_run,Icons.directions_subway,Icons.directions_transit,Icons.directions_walk,Icons.disc_full,Icons.dns,Icons.do_not_disturb,Icons.do_not_disturb_alt,Icons.do_not_disturb_off,Icons.do_not_disturb_on,Icons.dock,Icons.domain,Icons.done,Icons.done_all,Icons.done_outline,Icons.donut_large,Icons.donut_small,Icons.drafts,Icons.drag_handle,Icons.drive_eta,Icons.dvr,Icons.edit,Icons.edit_attributes,Icons.edit_location,Icons.eject,Icons.email,Icons.enhanced_encryption,Icons.equalizer,Icons.error,Icons.error_outline,Icons.euro_symbol,Icons.ev_station,Icons.event,Icons.event_available,Icons.event_busy,Icons.event_note,Icons.event_seat,Icons.exit_to_app,Icons.expand_less,Icons.expand_more,Icons.explicit,Icons.explore,Icons.exposure,Icons.exposure_neg_1,Icons.exposure_neg_2,Icons.exposure_plus_1,Icons.exposure_plus_2,Icons.exposure_zero,Icons.extension,Icons.face,Icons.fast_forward,Icons.fast_rewind,Icons.fastfood,Icons.favorite,Icons.favorite_border,Icons.featured_play_list,Icons.featured_video,Icons.feedback,Icons.fiber_dvr,Icons.fiber_manual_record,Icons.fiber_new,Icons.fiber_pin,Icons.fiber_smart_record,Icons.file_download,Icons.file_upload,Icons.filter,Icons.filter_1,Icons.filter_2,Icons.filter_3,Icons.filter_4,Icons.filter_5,Icons.filter_6,Icons.filter_7,Icons.filter_8,Icons.filter_9,Icons.filter_9_plus,Icons.filter_b_and_w,Icons.filter_center_focus,Icons.filter_drama,Icons.filter_frames,Icons.filter_hdr,Icons.filter_list,Icons.filter_none,Icons.filter_tilt_shift,Icons.filter_vintage,Icons.find_in_page,Icons.find_replace,Icons.fingerprint,Icons.first_page,Icons.fitness_center,Icons.flag,Icons.flare,Icons.flash_auto,Icons.flash_off,Icons.flash_on,Icons.flight,Icons.flight_land,Icons.flight_takeoff,Icons.flip,Icons.flip_to_back,Icons.flip_to_front,Icons.folder,Icons.folder_open,Icons.folder_shared,Icons.folder_special,Icons.font_download,Icons.format_align_center,Icons.format_align_justify,Icons.format_align_left,Icons.format_align_right,Icons.format_bold,Icons.format_clear,Icons.format_color_fill,Icons.format_color_reset,Icons.format_color_text,Icons.format_indent_decrease,Icons.format_indent_increase,Icons.format_italic,Icons.format_line_spacing,Icons.format_list_bulleted,Icons.format_list_numbered,Icons.format_list_numbered_rtl,Icons.format_paint,Icons.format_quote,Icons.format_shapes,Icons.format_size,Icons.format_strikethrough,Icons.format_textdirection_l_to_r,Icons.format_textdirection_r_to_l,Icons.format_underlined,Icons.forum,Icons.forward,Icons.forward_5,Icons.forward_10,Icons.forward_30,Icons.four_k,Icons.free_breakfast,Icons.fullscreen,Icons.fullscreen_exit,Icons.functions,Icons.g_translate,Icons.gamepad,Icons.games,Icons.gavel,Icons.gesture,Icons.get_app,Icons.gif,Icons.golf_course,Icons.gps_fixed,Icons.gps_not_fixed,Icons.gps_off,Icons.grade,Icons.gradient,Icons.grain,Icons.graphic_eq,Icons.grid_off,Icons.grid_on,Icons.group,Icons.group_add,Icons.group_work,Icons.hd,Icons.hdr_off,Icons.hdr_on,Icons.hdr_strong,Icons.hdr_weak,Icons.headset,Icons.headset_mic,Icons.headset_off,Icons.healing,Icons.hearing,Icons.help,Icons.help_outline,Icons.high_quality,Icons.highlight,Icons.highlight_off,Icons.history,Icons.home,Icons.hot_tub,Icons.hotel,Icons.hourglass_empty,Icons.hourglass_full,Icons.http,Icons.https,Icons.image,Icons.image_aspect_ratio,Icons.import_contacts,Icons.import_export,Icons.important_devices,Icons.inbox,Icons.indeterminate_check_box,Icons.info,Icons.info_outline,Icons.input,Icons.insert_chart,Icons.insert_comment,Icons.insert_drive_file,Icons.insert_emoticon,Icons.insert_invitation,Icons.insert_link,Icons.insert_photo,Icons.invert_colors,Icons.invert_colors_off,Icons.iso,Icons.keyboard,Icons.keyboard_arrow_down,Icons.keyboard_arrow_left,Icons.keyboard_arrow_right,Icons.keyboard_arrow_up,Icons.keyboard_backspace,Icons.keyboard_capslock,Icons.keyboard_hide,Icons.keyboard_return,Icons.keyboard_tab,Icons.keyboard_voice,Icons.kitchen,Icons.label,Icons.label_important,Icons.label_outline,Icons.landscape,Icons.language,Icons.laptop,Icons.laptop_chromebook,Icons.laptop_mac,Icons.laptop_windows,Icons.last_page,Icons.launch,Icons.layers,Icons.layers_clear,Icons.leak_add,Icons.leak_remove,Icons.lens,Icons.library_add,Icons.library_books,Icons.library_music,Icons.lightbulb_outline,Icons.line_style,Icons.line_weight,Icons.linear_scale,Icons.link,Icons.link_off,Icons.linked_camera,Icons.list,Icons.live_help,Icons.live_tv,Icons.local_activity,Icons.local_airport,Icons.local_atm,Icons.local_bar,Icons.local_cafe,Icons.local_car_wash,Icons.local_convenience_store,Icons.local_dining,Icons.local_drink,Icons.local_florist,Icons.local_gas_station,Icons.local_grocery_store,Icons.local_hospital,Icons.local_hotel,Icons.local_laundry_service,Icons.local_library,Icons.local_mall,Icons.local_movies,Icons.local_offer,Icons.local_parking,Icons.local_pharmacy,Icons.local_phone,Icons.local_pizza,Icons.local_play,Icons.local_post_office,Icons.local_printshop,Icons.local_see,Icons.local_shipping,Icons.local_taxi,Icons.location_city,Icons.location_disabled,Icons.location_off,Icons.location_on,Icons.location_searching,Icons.lock,Icons.lock_open,Icons.lock_outline,Icons.looks,Icons.looks_3,Icons.looks_4,Icons.looks_5,Icons.looks_6,Icons.looks_one,Icons.looks_two,Icons.loop,Icons.loupe,Icons.low_priority,Icons.loyalty,Icons.mail,Icons.mail_outline,Icons.map,Icons.markunread,Icons.markunread_mailbox,Icons.maximize,Icons.memory,Icons.menu,Icons.merge_type,Icons.message,Icons.mic,Icons.mic_none,Icons.mic_off,Icons.minimize,Icons.missed_video_call,Icons.mms,Icons.mobile_screen_share,Icons.mode_comment,Icons.mode_edit,Icons.monetization_on,Icons.money_off,Icons.monochrome_photos,Icons.mood,Icons.mood_bad,Icons.more,Icons.more_horiz,Icons.more_vert,Icons.motorcycle,Icons.mouse,Icons.move_to_inbox,Icons.movie,Icons.movie_creation,Icons.movie_filter,Icons.multiline_chart,Icons.music_note,Icons.music_video,Icons.my_location,Icons.nature,Icons.nature_people,Icons.navigate_before,Icons.navigate_next,Icons.navigation,Icons.near_me,Icons.network_cell,Icons.network_check,Icons.network_locked,Icons.network_wifi,Icons.new_releases,Icons.next_week,Icons.nfc,Icons.no_encryption,Icons.no_sim,Icons.not_interested,Icons.not_listed_location,Icons.note,Icons.note_add,Icons.notification_important,Icons.notifications,Icons.notifications_active,Icons.notifications_none,Icons.notifications_off,Icons.notifications_paused,Icons.offline_bolt,Icons.offline_pin,Icons.ondemand_video,Icons.opacity,Icons.open_in_browser,Icons.open_in_new,Icons.open_with,Icons.outlined_flag,Icons.pages,Icons.pageview,Icons.palette,Icons.pan_tool,Icons.panorama,Icons.panorama_fish_eye,Icons.panorama_horizontal,Icons.panorama_vertical,Icons.panorama_wide_angle,Icons.party_mode,Icons.pause,Icons.pause_circle_filled,Icons.pause_circle_outline,Icons.payment,Icons.people,Icons.people_outline,Icons.perm_camera_mic,Icons.perm_contact_calendar,Icons.perm_data_setting,Icons.perm_device_information,Icons.perm_identity,Icons.perm_media,Icons.perm_phone_msg,Icons.perm_scan_wifi,Icons.person,Icons.person_add,Icons.person_outline,Icons.person_pin,Icons.person_pin_circle,Icons.personal_video,Icons.pets,Icons.phone,Icons.phone_android,Icons.phone_bluetooth_speaker,Icons.phone_forwarded,Icons.phone_in_talk,Icons.phone_iphone,Icons.phone_locked,Icons.phone_missed,Icons.phone_paused,Icons.phonelink,Icons.phonelink_erase,Icons.phonelink_lock,Icons.phonelink_off,Icons.phonelink_ring,Icons.phonelink_setup,Icons.photo,Icons.photo_album,Icons.photo_camera,Icons.photo_filter,Icons.photo_library,Icons.photo_size_select_actual,Icons.photo_size_select_large,Icons.photo_size_select_small,Icons.picture_as_pdf,Icons.picture_in_picture,Icons.picture_in_picture_alt,Icons.pie_chart,Icons.pie_chart_outlined,Icons.pin_drop,Icons.place,Icons.play_arrow,Icons.play_circle_filled,Icons.play_circle_outline,Icons.play_for_work,Icons.playlist_add,Icons.playlist_add_check,Icons.playlist_play,Icons.plus_one,Icons.poll,Icons.polymer,Icons.pool,Icons.portable_wifi_off,Icons.portrait,Icons.power,Icons.power_input,Icons.power_settings_new,Icons.pregnant_woman,Icons.present_to_all,Icons.print,Icons.priority_high,Icons.public,Icons.publish,Icons.query_builder,Icons.question_answer,Icons.queue,Icons.queue_music,Icons.queue_play_next,Icons.radio,Icons.radio_button_checked,Icons.radio_button_unchecked,Icons.rate_review,Icons.receipt,Icons.recent_actors,Icons.record_voice_over,Icons.redeem,Icons.redo,Icons.refresh,Icons.remove,Icons.remove_circle,Icons.remove_circle_outline,Icons.remove_from_queue,Icons.remove_red_eye,Icons.remove_shopping_cart,Icons.reorder,Icons.repeat,Icons.repeat_one,Icons.replay,Icons.replay_5,Icons.replay_10,Icons.replay_30,Icons.reply,Icons.reply_all,Icons.report,Icons.report_off,Icons.report_problem,Icons.restaurant,Icons.restaurant_menu,Icons.restore,Icons.restore_from_trash,Icons.restore_page,Icons.ring_volume,Icons.room,Icons.room_service,Icons.rotate_90_degrees_ccw,Icons.rotate_left,Icons.rotate_right,Icons.rounded_corner,Icons.router,Icons.rowing,Icons.rss_feed,Icons.rv_hookup,Icons.satellite,Icons.save,Icons.save_alt,Icons.scanner,Icons.scatter_plot,Icons.schedule,Icons.school,Icons.score,Icons.screen_lock_landscape,Icons.screen_lock_portrait,Icons.screen_lock_rotation,Icons.screen_rotation,Icons.screen_share,Icons.sd_card,Icons.sd_storage,Icons.search,Icons.security,Icons.select_all,Icons.send,Icons.sentiment_dissatisfied,Icons.sentiment_neutral,Icons.sentiment_satisfied,Icons.sentiment_very_dissatisfied,Icons.sentiment_very_satisfied,Icons.settings,Icons.settings_applications,Icons.settings_backup_restore,Icons.settings_bluetooth,Icons.settings_brightness,Icons.settings_cell,Icons.settings_ethernet,Icons.settings_input_antenna,Icons.settings_input_component,Icons.settings_input_composite,Icons.settings_input_hdmi,Icons.settings_input_svideo,Icons.settings_overscan,Icons.settings_phone,Icons.settings_power,Icons.settings_remote,Icons.settings_system_daydream,Icons.settings_voice,Icons.share,Icons.shop,Icons.shop_two,Icons.shopping_basket,Icons.shopping_cart,Icons.short_text,Icons.show_chart,Icons.shuffle,Icons.shutter_speed,Icons.signal_cellular_4_bar,Icons.signal_cellular_connected_no_internet_4_bar,Icons.signal_cellular_no_sim,Icons.signal_cellular_null,Icons.signal_cellular_off,Icons.signal_wifi_4_bar,Icons.signal_wifi_4_bar_lock,Icons.signal_wifi_off,Icons.sim_card,Icons.sim_card_alert,Icons.skip_next,Icons.skip_previous,Icons.slideshow,Icons.slow_motion_video,Icons.smartphone,Icons.smoke_free,Icons.smoking_rooms,Icons.sms,Icons.sms_failed,Icons.snooze,Icons.sort,Icons.sort_by_alpha,Icons.spa,Icons.space_bar,Icons.speaker,Icons.speaker_group,Icons.speaker_notes,Icons.speaker_notes_off,Icons.speaker_phone,Icons.spellcheck,Icons.star,Icons.star_border,Icons.star_half,Icons.stars,Icons.stay_current_landscape,Icons.stay_current_portrait,Icons.stay_primary_landscape,Icons.stay_primary_portrait,Icons.stop,Icons.stop_screen_share,Icons.storage,Icons.store,Icons.store_mall_directory,Icons.straighten,Icons.streetview,Icons.strikethrough_s,Icons.style,Icons.subdirectory_arrow_left,Icons.subdirectory_arrow_right,Icons.subject,Icons.subscriptions,Icons.subtitles,Icons.subway,Icons.supervised_user_circle,Icons.supervisor_account,Icons.surround_sound,Icons.swap_calls,Icons.swap_horiz,Icons.swap_horizontal_circle,Icons.swap_vert,Icons.swap_vertical_circle,Icons.switch_camera,Icons.switch_video,Icons.sync,Icons.sync_disabled,Icons.sync_problem,Icons.system_update,Icons.system_update_alt,Icons.tab,Icons.tab_unselected,Icons.table_chart,Icons.tablet,Icons.tablet_android,Icons.tablet_mac,Icons.tag_faces,Icons.tap_and_play,Icons.terrain,Icons.text_fields,Icons.text_format,Icons.text_rotate_up,Icons.text_rotate_vertical,Icons.text_rotation_angledown,Icons.text_rotation_angleup,Icons.text_rotation_down,Icons.text_rotation_none,Icons.textsms,Icons.texture,Icons.theaters,Icons.threed_rotation,Icons.threesixty,Icons.thumb_down,Icons.thumb_up,Icons.thumbs_up_down,Icons.time_to_leave,Icons.timelapse,Icons.timeline,Icons.timer,Icons.timer_3,Icons.timer_10,Icons.timer_off,Icons.title,Icons.toc,Icons.today,Icons.toll,Icons.tonality,Icons.touch_app,Icons.toys,Icons.track_changes,Icons.traffic,Icons.train,Icons.tram,Icons.transfer_within_a_station,Icons.transform,Icons.transit_enterexit,Icons.translate,Icons.trending_down,Icons.trending_flat,Icons.trending_up,Icons.trip_origin,Icons.tune,Icons.turned_in,Icons.turned_in_not,Icons.tv,Icons.unarchive,Icons.undo,Icons.unfold_less,Icons.unfold_more,Icons.update,Icons.usb,Icons.verified_user,Icons.vertical_align_bottom,Icons.vertical_align_center,Icons.vertical_align_top,Icons.vibration,Icons.video_call,Icons.video_label,Icons.video_library,Icons.videocam,Icons.videocam_off,Icons.videogame_asset,Icons.view_agenda,Icons.view_array,Icons.view_carousel,Icons.view_column,Icons.view_comfy,Icons.view_compact,Icons.view_day,Icons.view_headline,Icons.view_list,Icons.view_module,Icons.view_quilt,Icons.view_stream,Icons.view_week,Icons.vignette,Icons.visibility,Icons.visibility_off,Icons.voice_chat,Icons.voicemail,Icons.volume_down,Icons.volume_mute,Icons.volume_off,Icons.volume_up,Icons.vpn_key,Icons.vpn_lock,Icons.wallpaper,Icons.warning,Icons.watch,Icons.watch_later,Icons.wb_auto,Icons.wb_cloudy,Icons.wb_incandescent,Icons.wb_iridescent,Icons.wb_sunny,Icons.wc,Icons.web,Icons.web_asset,Icons.weekend,Icons.whatshot,Icons.widgets,Icons.wifi,Icons.wifi_lock,Icons.wifi_tethering,Icons.work,Icons.wrap_text,Icons.youtube_searched_for,Icons.zoom_in,Icons.zoom_out,Icons.zoom_out_map]; +} + +class CupertinoIIconNames { + static List names = [CupertinoIcons.add,CupertinoIcons.add_circled,CupertinoIcons.add_circled_solid,CupertinoIcons.back,CupertinoIcons.battery_25_percent,CupertinoIcons.battery_75_percent,CupertinoIcons.battery_charging,CupertinoIcons.battery_empty,CupertinoIcons.battery_full,CupertinoIcons.bluetooth,CupertinoIcons.book,CupertinoIcons.book_solid,CupertinoIcons.bookmark,CupertinoIcons.bookmark_solid,CupertinoIcons.check_mark,CupertinoIcons.check_mark_circled,CupertinoIcons.check_mark_circled_solid,CupertinoIcons.clear,CupertinoIcons.clear_circled,CupertinoIcons.clear_circled_solid,CupertinoIcons.clear_thick,CupertinoIcons.clear_thick_circled,CupertinoIcons.clock,CupertinoIcons.clock_solid,CupertinoIcons.collections,CupertinoIcons.collections_solid,CupertinoIcons.conversation_bubble,CupertinoIcons.create,CupertinoIcons.create_solid,CupertinoIcons.delete,CupertinoIcons.delete_simple,CupertinoIcons.delete_solid,CupertinoIcons.down_arrow,CupertinoIcons.ellipsis,CupertinoIcons.eye,CupertinoIcons.eye_solid,CupertinoIcons.flag,CupertinoIcons.folder,CupertinoIcons.folder_open,CupertinoIcons.folder_solid,CupertinoIcons.forward,CupertinoIcons.fullscreen,CupertinoIcons.fullscreen_exit,CupertinoIcons.gear,CupertinoIcons.gear_big,CupertinoIcons.gear_solid,CupertinoIcons.group,CupertinoIcons.group_solid,CupertinoIcons.home,CupertinoIcons.info,CupertinoIcons.left_chevron,CupertinoIcons.location,CupertinoIcons.location_solid,CupertinoIcons.loop,CupertinoIcons.loop_thick,CupertinoIcons.mail,CupertinoIcons.mail_solid,CupertinoIcons.mic,CupertinoIcons.mic_off,CupertinoIcons.mic_solid,CupertinoIcons.minus_circled,CupertinoIcons.music_note,CupertinoIcons.padlock,CupertinoIcons.padlock_solid,CupertinoIcons.pause,CupertinoIcons.pause_solid,CupertinoIcons.pen,CupertinoIcons.pencil,CupertinoIcons.person,CupertinoIcons.person_add,CupertinoIcons.person_add_solid,CupertinoIcons.person_solid,CupertinoIcons.phone,CupertinoIcons.phone_solid,CupertinoIcons.photo_camera,CupertinoIcons.photo_camera_solid,CupertinoIcons.play_arrow,CupertinoIcons.play_arrow_solid,CupertinoIcons.plus_circled,CupertinoIcons.profile_circled,CupertinoIcons.refresh,CupertinoIcons.refresh_bold,CupertinoIcons.refresh_circled,CupertinoIcons.refresh_circled_solid,CupertinoIcons.refresh_thick,CupertinoIcons.refresh_thin,CupertinoIcons.reply,CupertinoIcons.reply_all,CupertinoIcons.reply_thick_solid,CupertinoIcons.restart,CupertinoIcons.right_chevron,CupertinoIcons.search,CupertinoIcons.settings,CupertinoIcons.settings_solid,CupertinoIcons.share,CupertinoIcons.share_solid,CupertinoIcons.share_up,CupertinoIcons.shopping_cart,CupertinoIcons.shuffle_thick,CupertinoIcons.switch_camera,CupertinoIcons.switch_camera_solid,CupertinoIcons.tag,CupertinoIcons.tag_solid,CupertinoIcons.tags,CupertinoIcons.tags_solid,CupertinoIcons.time,CupertinoIcons.time_solid,CupertinoIcons.up_arrow,CupertinoIcons.video_camera,CupertinoIcons.video_camera_solid,CupertinoIcons.volume_down,CupertinoIcons.volume_mute,CupertinoIcons.volume_off,CupertinoIcons.volume_up]; } \ No newline at end of file diff --git a/lib/common/widget_demo.dart b/lib/common/widget_demo.dart index f64bde54..37653e28 100644 --- a/lib/common/widget_demo.dart +++ b/lib/common/widget_demo.dart @@ -154,7 +154,7 @@ class _WidgetDemoState extends State { new IconButton( tooltip: 'goBack home', onPressed: () { - Navigator.popUntil(context, ModalRoute.withName('/')); + Navigator.popUntil(context, ModalRoute.withName('/home')); }, icon: Icon(Icons.home), ), diff --git a/lib/common/widget_name_to_icon.dart b/lib/common/widget_name_to_icon.dart index 188e848f..909bf110 100644 --- a/lib/common/widget_name_to_icon.dart +++ b/lib/common/widget_name_to_icon.dart @@ -145,6 +145,15 @@ class WidgetName2Icon { "SimpleDialog":Icons.message, "ScaffoldState":Icons.local_bar, "GridTile":Icons.apps, - "MergeableMaterialItem":Icons.view_list + "MergeableMaterialItem":Icons.view_list, + "CupertinoApp":Icons.face, + "CupertinoButton":Icons.crop_7_5, + "CupertinoColors":Icons.color_lens, + "CupertinoIcons":Icons.insert_emoticon, + "CupertinoNavigationBar":Icons.payment, + "CupertinoPageRoute":Icons.router, + "CupertinoPageScaffold":Icons.pages, + "CupertinoPicker":Icons.add_alarm, + "CupertinoPopupSurface":Icons.center_focus_weak, }; } diff --git a/lib/components/disclaimer_msg.dart b/lib/components/disclaimer_msg.dart index a070a2a2..538f0383 100644 --- a/lib/components/disclaimer_msg.dart +++ b/lib/components/disclaimer_msg.dart @@ -35,7 +35,7 @@ class DisclaimerMsgState extends State { final SharedPreferences prefs = await _prefs; final bool unKnow = value; setState(() { - _unKnow = prefs.setBool("disclaimer", unKnow).then((bool success) { + _unKnow = prefs.setBool("disclaimer::Boolean", unKnow).then((bool success) { return unKnow; }); }); @@ -46,7 +46,7 @@ class DisclaimerMsgState extends State { super.initState(); //获取SharedPreferences 存储结果 _unKnow = _prefs.then((SharedPreferences prefs) { - return (prefs.getBool('disclaimer') ?? false); + return (prefs.getBool('disclaimer::Boolean') ?? false); }); _unKnow.then((bool value) { _valBool = value; diff --git a/lib/model/collection_general.dart b/lib/model/collection_general.dart index 9e23674d..18367092 100644 --- a/lib/model/collection_general.dart +++ b/lib/model/collection_general.dart @@ -50,7 +50,6 @@ class CollectionControlModel { List list = await sql.getByCondition(); List resultList = []; list.forEach((item){ - print(item); resultList.add(CollectionGeneral.fromJSON(item)); }); return resultList; diff --git a/lib/views/collection_page.dart b/lib/views/collection_page.dart index b1e0fe60..af417ad7 100644 --- a/lib/views/collection_page.dart +++ b/lib/views/collection_page.dart @@ -104,7 +104,7 @@ class _CollectionPageState extends State { color: Theme.of(context).primaryColor, ), title: Text( - _collectionList[index - 1].name, + Uri.decodeComponent(_collectionList[index - 1].name), overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 17.0), ), @@ -112,8 +112,9 @@ class _CollectionPageState extends State { Icon(Icons.keyboard_arrow_right, color: Colors.grey, size: 30.0), onTap: () { if (_collectionList[index - 1].router.contains('http')) { + // 注意这里title已经转义过了 Application.router.navigateTo(context, - '${Routes.webViewPage}?title=${Uri.encodeComponent(_collectionList[index - 1].name)}&url=${Uri.encodeComponent(_collectionList[index - 1].router)}'); + '${Routes.webViewPage}?title=${_collectionList[index - 1].name}&url=${Uri.encodeComponent(_collectionList[index - 1].router)}'); } else { Application.router .navigateTo(context, "${_collectionList[index - 1].router}"); diff --git a/lib/views/first_page.dart b/lib/views/first_page.dart index 6de4a951..de3ec5a3 100644 --- a/lib/views/first_page.dart +++ b/lib/views/first_page.dart @@ -30,20 +30,22 @@ class FirstPageState extends State with AutomaticKeepAliveClientMixin if (key == null) { key = GlobalKey(); //获取sharePre - _unKnow = _prefs.then((SharedPreferences prefs) { - return (prefs.getBool('disclaimer') ?? false); - }); + _unKnow = _prefs.then((SharedPreferences prefs) { + return (prefs.getBool('disclaimer::Boolean') ?? false); + }); + /** * 判断是否需要弹出免责声明,已经勾选过不在显示,就不会主动弹 */ _unKnow.then((bool value) { print("==========FirstPageState========_unKnow========${value}"); - if (!value) { - key.currentState.showAlertDialog(context); - } + new Future.delayed(const Duration(seconds: 1),(){ + if (!value) { + key.currentState.showAlertDialog(context); + } + }); }); } - } @@ -51,12 +53,18 @@ class FirstPageState extends State with AutomaticKeepAliveClientMixin const juejin_flutter = 'https://timeline-merger-ms.juejin.im/v1/get_tag_entry?src=web&tagId=5a96291f6fb9a0535b535438'; var pageIndex = (params is Map) ? params['pageIndex'] : 0; final _param = {'page':pageIndex,'pageSize':20,'sort':'rankIndex'}; + var responseList = []; + var pageTotal = 0; + + try{ + var response = await NetUtils.get(juejin_flutter, params: _param); + responseList = response['d']['entrylist']; + pageTotal = response['d']['total']; + if (!(pageTotal is int) || pageTotal <= 0) { + pageTotal = 0; + } + }catch(e){ - var response = await NetUtils.get(juejin_flutter, params: _param); - var responseList = response['d']['entrylist']; - var pageTotal = response['d']['total']; - if (!(pageTotal is int) || pageTotal <= 0) { - pageTotal = 0; } pageIndex += 1; List resultList = new List(); diff --git a/lib/views/home.dart b/lib/views/home.dart index 0ba094af..4eb9b49d 100644 --- a/lib/views/home.dart +++ b/lib/views/home.dart @@ -43,8 +43,8 @@ class _MyHomePageState extends State static List tabData = [ {'text': '业界动态', 'icon': new Icon(Icons.language)}, {'text': 'WIDGET', 'icon': new Icon(Icons.extension)}, - {'text': '组件收藏', 'icon': new Icon(Icons.star)}, - {'text': '关于手册', 'icon': new Icon(Icons.favorite)} + {'text': '组件收藏', 'icon': new Icon(Icons.favorite)}, + {'text': '关于手册', 'icon': new Icon(Icons.import_contacts)} ]; List myTabs = []; @@ -139,12 +139,7 @@ class _MyHomePageState extends State indicatorWeight: 3.0, labelColor: Theme.of(context).primaryColor, unselectedLabelColor: const Color(0xFF8E8E8E), - tabs: [ - Tab(text: '业界动态', icon: Icon(Icons.language)), - Tab(text: '组件', icon: Icon(Icons.extension)), - Tab(text: '组件收藏', icon: Icon(Icons.favorite)), - Tab(text: '关于手册', icon: Icon(Icons.line_weight)), - ], + tabs: myTabs ), ), ), diff --git a/lib/views/web_view_page.dart b/lib/views/web_view_page.dart index 27b0eb78..1cbbe1a0 100644 --- a/lib/views/web_view_page.dart +++ b/lib/views/web_view_page.dart @@ -10,6 +10,7 @@ import '../model/collection.dart'; import '../event/event-bus.dart'; import '../event/event-model.dart'; import 'package:fluttertoast/fluttertoast.dart'; +import 'dart:core'; class WebViewPage extends StatefulWidget { final String url; @@ -38,7 +39,7 @@ class _WebViewPageState extends State { @override void initState() { super.initState(); - _collectionControl.getRouterByName(widget.title.trim()).then((list) { + _collectionControl.getRouterByName(Uri.encodeComponent(widget.title.trim())).then((list) { list.forEach((item) { if(widget.title.trim() == item['name']){ @@ -57,7 +58,7 @@ class _WebViewPageState extends State { _getCollection() { if (_hasCollected) { // 删除操作 - _collectionControl.deleteByName(widget.title.trim()).then((result) { + _collectionControl.deleteByName(Uri.encodeComponent(widget.title.trim())).then((result) { if (result > 0 && this.mounted) { setState(() { _hasCollected = false; @@ -75,7 +76,7 @@ class _WebViewPageState extends State { } else { // 插入操作 _collectionControl - .insert(Collection(name: widget.title.trim(), router: widget.url)) + .insert(Collection(name:Uri.encodeComponent(widget.title.trim()) , router: widget.url)) .then((result) { if (this.mounted) { setState(() { diff --git a/lib/widgets/components/Bar/AppBar/index.dart b/lib/widgets/components/Bar/AppBar/index.dart index eda42fc0..5282d352 100644 --- a/lib/widgets/components/Bar/AppBar/index.dart +++ b/lib/widgets/components/Bar/AppBar/index.dart @@ -48,7 +48,7 @@ class _DemoState extends State { Widget build(BuildContext context) { return WidgetDemo( title: 'AppBar', - codeUrl: 'componentss/Bar/AppBar/demo.dart', + codeUrl: 'components/Bar/AppBar/demo.dart', contentList: [allDomes(context, this)], docUrl: 'https://docs.flutter.io/flutter/material/AppBar-class.html', ); diff --git a/lib/widgets/components/Navigation/BottomNavigationBar/demo.dart b/lib/widgets/components/Navigation/BottomNavigationBar/demo.dart index a34335e1..bfb57610 100644 --- a/lib/widgets/components/Navigation/BottomNavigationBar/demo.dart +++ b/lib/widgets/components/Navigation/BottomNavigationBar/demo.dart @@ -45,6 +45,12 @@ class _BottomNavigationBarFullDefault extends State { title: new Text("List"), icon: new Icon(Icons.list)), BottomNavigationBarItem( title: new Text("Message"), icon: new Icon(Icons.message)), + BottomNavigationBarItem( + title: new Text("add"), icon: new Icon(Icons.add)), + BottomNavigationBarItem( + title: new Text("menu"), icon: new Icon(Icons.menu)), + BottomNavigationBarItem( + title: new Text("other"), icon: new Icon(Icons.devices_other)), ], ); diff --git a/lib/widgets/components/Navigation/BottomNavigationBar/index.dart b/lib/widgets/components/Navigation/BottomNavigationBar/index.dart index d5241c19..46860484 100644 --- a/lib/widgets/components/Navigation/BottomNavigationBar/index.dart +++ b/lib/widgets/components/Navigation/BottomNavigationBar/index.dart @@ -25,7 +25,7 @@ const String _text1 = """### **基本用法** > BottomNavigationBar 底部导航栏通常与Scaffold结合使用 - 它作为 Scaffold.bottomNavigationBar 参数; -- BottomNavigationBar 支持0-4个之间个底部按钮数量,超出4个系统将会报异常; +- BottomNavigationBar 3-5个之间个底部按钮数量是合理的,理论上 icon 大小合适,可以支持更多; - 默认0-3个底部按钮数量时,BottomNavigationBar采用fixed的模式摆放底部按钮,当有4个时默认使用 BottomNavigationBarType.shifting 模式摆放底部按钮; - 下面的底部导航即是效果; """; diff --git a/lib/widgets/themes/Cupertino/CupertinoApp/demo.dart b/lib/widgets/themes/Cupertino/CupertinoApp/demo.dart new file mode 100644 index 00000000..ae675c6a --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoApp/demo.dart @@ -0,0 +1,172 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoApp 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/* +* Checkbox 默认按钮的实例 +* index 当前checkbox 的索引值 +* */ +class CupertinoAppFullDefault extends StatefulWidget { + const CupertinoAppFullDefault() : super(); + + @override + State createState() => _CupertinoAppFullDefault(); +} + +/* +* CupertinoApp 默认的实例,有状态 +* */ +class _CupertinoAppFullDefault extends State { + + RouterHandler(setting){ + //setting.isInitialRoute; bool类型 是否初始路由 + //setting.name; 要跳转的路由名key + return PageRouteBuilder( + pageBuilder: (BuildContext context, _, __) { + //这里为返回的Widget + return HomePage(); + }, + opaque: false, + //跳转动画 + transitionDuration: Duration(milliseconds: 200), + transitionsBuilder: (___, Animation animation, ____, Widget child) { + return FadeTransition( + opacity: animation, + child: new ScaleTransition( + scale: new Tween(begin: 0.5, end: 1.0) + .animate(animation), + child: child, + ), + ); + } + ); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + //height: 500.0, + child: CupertinoApp( + title: '这里是标题',// 设备用于识别用户的应用程序的单行描述 + builder: (BuildContext context,Widget child) { // 覆盖下面的所有界面,一般当作追加属性用 + //return Container(child:Text('这里是内容1',style:TextStyle(color:Colors.black))); + return MediaQuery(// 当构建一个Widget前,调用一般做字体大小,方向,主题颜色等配置 + //字体大小 + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.4), + child: child + ); + }, + checkerboardOffscreenLayers:false, // 打开渲染到屏幕外位图的图层的checkerboarding + checkerboardRasterCacheImages:false, // 打开光栅缓存图像的检查板。 + debugShowCheckedModeBanner:true,// 在debug模式下打开一个小“DEBUG”横幅,表示该应用程序处于检查模式 + color: Colors.red, // 该颜色为程序切换中应用图标背景的颜色,当应用图标背景为透明时 +// home: HomePage(),// 进入程序后显示的第一个页面,传入的是一个Widget,但实际上这个Widget需要包裹一个Scaffold + home: CupertinoPageScaffold(// 进入程序后显示的第一个页面,传入的是一个Widget,但实际上这个Widget需要包裹一个Scaffold + navigationBar: CupertinoNavigationBar( + leading: Icon(CupertinoIcons.back), + middle: Text('Title'), + trailing: Icon(CupertinoIcons.share), + ), + child:Container( // home 对应的内容和 router对应的内容,同时存在 + padding: const EdgeInsets.only(bottom: 60.0), + alignment: Alignment.center, + child:Text('这里是 home 属性对应的内容',style:TextStyle(color:Colors.black)) + ), // 应用程序默认路由,(Navigator.defaultRouteName,即/) + ), + initialRoute:'/home',// 如果构建了导航器,则显示的第一条路径的名称,初始路由,当用户进入程序时,自动打开对应的路由。(home还是位于一级)传入的是上面routes的key + locale:Locale('zh', 'CH'),// 本地化初始值 + localeResolutionCallback: (local,support){// 区域分辨回调,当传入的是不支持的语种,可以根据这个回调,返回相近,并且支持的语种 + return const Locale('us','uk'); + }, + localizationsDelegates:[], // 本地化委托,用于更改Flutter Widget默认的提示语,按钮text等,返回一个 继承自 LocalizationsDelegate 的对象 + navigatorKey:GlobalKey(), // 导航主键 GlobalKey + navigatorObservers: [ // 路由观察器,当调用Navigator的相关方法时,会回调相关的操作 + MyObserver(), + ], + onGenerateRoute: (setting){ // 当通过Navigation.of(context).pushNamed跳转路由时,在routes查找不到时,会调用该方法 + RouterHandler(setting); + }, + onGenerateTitle: (context){ // 跟上面的tiitle一样,但含有一个context参数用于做本地化 + return 'Flutter应用'; + }, + onUnknownRoute: (setting){ // 效果跟onGenerateRoute一样调用顺序为onGenerateRoute ==> onUnknownRoute + //RouterHandler(setting); + }, + routes: { // 声明程序中有哪个通过Navigation.of(context).pushNamed跳转的路由参数以键值对的形式传递key:路由名字value:对应的Widget + '/home':(BuildContext context) => HomePage(), + '/home/one':(BuildContext context) => OnePage(), + }, + showPerformanceOverlay:false, // 当为true时应用程序顶部覆盖一层GPU和UI曲线图,可即时查看当前流畅度情况 + showSemanticsDebugger:false, // 当为true时,打开Widget边框,类似Android开发者模式中显示布局边界 + supportedLocales:[// 传入支持的语种数组 + const Locale('uok'), + const Locale('meg'), + ], + ) + ); + } + + Widget homeBuild(BuildContext context) { + return CupertinoTabScaffold( + tabBar: CupertinoTabBar( + backgroundColor: CupertinoColors.white, + items: const [ + BottomNavigationBarItem( + icon: ImageIcon( + AssetImage('assets/images/btn_icon_dingyuehao_normal.png')), + title: Text('Tab 1'), + ), + BottomNavigationBarItem( + icon: ImageIcon( + AssetImage('assets/images/btn_icon_dingyuehao_normal.png')), + title: Text('Tab 2'), + ), + ]), + tabBuilder: (BuildContext context, int index) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + backgroundColor: CupertinoColors.destructiveRed, + middle: Text('这里是标题', style: TextStyle(color: Colors.white)), + ), + child: Center(child: Text('这里是内容', style: TextStyle(color: Colors.black))), + backgroundColor: CupertinoColors.extraLightBackgroundGray, + ); + } + ); + } +} + +class MyObserver extends NavigatorObserver{ + @override + void didPush(Route route, Route previousRoute) { + // 当调用Navigator.push时回调 + super.didPush(route, previousRoute); + //可通过route.settings获取路由相关内容 + //route.currentResult获取返回内容 + print('MyObserver 路由观察器:${route.settings.name}'); + } +} + +class HomePage extends StatelessWidget{ + @override + Widget build(BuildContext context){ + return Center(child:Text('HomePage',style:TextStyle(color:Colors.black))); + } +} + +class OnePage extends StatelessWidget{ + @override + Widget build(BuildContext context){ + return Center(child:Text('OnePage',style:TextStyle(color:Colors.red))); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoApp/index.dart b/lib/widgets/themes/Cupertino/CupertinoApp/index.dart new file mode 100644 index 00000000..21adb1d7 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoApp/index.dart @@ -0,0 +1,53 @@ +/* + * @Author: 一凨 + * @Date: 2018-12-27 16:25:22 + * @Last Modified by: 一凨 + * @Last Modified time: 2019-01-07 15:52:45 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> Cupertino 苹果设计风格的应用,用于创建 iOS 风格应用的顶层组件( Cupertino 苹果电脑的全球总公司所在地,位于美国旧金山 ) +- 它包含了 iOS 应用程序,通常需要的许多 widget; +- 它的构建于基于 iOS 的 WidgetsApp 特定的默认值,如字体和物理滚动; +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoApp 的主要特性 +- top 级别的 Navigator 搜索的配置,需要遵循以下规则优先级 + - 首先,对于 根路由 "/", 使用 home 属性,前提是 home 属性不为空; + - 如果没设置home,则使用 routes 属性,它应用程序的顶级路由表; + - 如果 home 和 routes 都没有做有效配置,则调用onGenerateRoute(如果提供),并且返回非null值; + - 最后,如果所有其他方法都失败onUnknownRoute被调用; + - 如果 home,routes,onGenerateRoute和onUnknownRoute 都为null,并且builder不为null,则不会创建任何Navigator; + - 如果配置了顶级 Navigator 的 observer,则可以做 Hero 动画; +- 在 Android 上谨慎使用此 widget,因为它可能会产生 Android 用户不同的行为,例如: + - 通过反向滑动可以禁用页面; + - 滚动到底或者顶,会触发 ios 风格的弹性效果; + - 某些苹果字体系列在 Android上 不可用,可能导致未定义的字体提示。 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoApp'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoAppFullDefault() + ], + title: 'CupertinoApp', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoApp-class.html', + codeUrl: '/themes/Cupertino/CupertinoApp/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoButton/demo.dart b/lib/widgets/themes/Cupertino/CupertinoButton/demo.dart new file mode 100644 index 00000000..02cf2417 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoButton/demo.dart @@ -0,0 +1,41 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoButton 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/* +* Checkbox 默认按钮的实例 +* index 当前checkbox 的索引值 +* */ +class CupertinoButtonFullDefault extends StatefulWidget { + const CupertinoButtonFullDefault() : super(); + + @override + State createState() => _CupertinoButtonFullDefault(); +} + +/* +* CupertinoButton 默认的实例,有状态 +* */ +class _CupertinoButtonFullDefault extends State { + + @override + Widget build(BuildContext context) { + return CupertinoButton( + borderRadius: BorderRadius.all(Radius.circular(15.0)), + onPressed: () { + print('on Pressed!'); + }, + pressedOpacity:0.5,// 按下后的按钮不透明度 + color:CupertinoColors.darkBackgroundGray, + child: new Text('CupertinoButton'), + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoButton/index.dart b/lib/widgets/themes/Cupertino/CupertinoButton/index.dart new file mode 100644 index 00000000..28c9d9f9 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoButton/index.dart @@ -0,0 +1,45 @@ +/** + * Created with Android Studio. + * User: 一晟 + * Date: 2019/1/20 + * Time: 下午10:57 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoButton 的示例 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> ios 风格的 button +- 与普通的 button 一样,需要设置 text 或者 icon, 不同的是带有 fades out 效果; +- 同时可以设置一个背景颜色; +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoButton 的一个是示例 +- 属性基本和 flatButton,raisedButton 类似 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoButton'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoButtonFullDefault() + ], + title: 'CupertinoButton', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoButton-class.html', + codeUrl: '/themes/Cupertino/CupertinoButton/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoColors/demo.dart b/lib/widgets/themes/Cupertino/CupertinoColors/demo.dart new file mode 100644 index 00000000..b6bbacb4 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoColors/demo.dart @@ -0,0 +1,51 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoColors 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/* +* Checkbox 默认按钮的实例 +* index 当前checkbox 的索引值 +* */ +class CupertinoColorsFullDefault extends StatefulWidget { + const CupertinoColorsFullDefault() : super(); + + @override + State createState() => _CupertinoColorsFullDefault(); +} + +/* +* CupertinoColors 默认的实例,有状态 +* */ +class _CupertinoColorsFullDefault extends State { + + Widget setColorsView(Cupertino_colors){ + return Container( + width: MediaQuery.of(context).size.width-100, + padding: const EdgeInsets.all(10.0), + child:Text('activeBlue',style:TextStyle(color:Colors.white)), + decoration:BoxDecoration(color: Cupertino_colors) + ); + } + @override + Widget build(BuildContext context) { + return Column( + children: [ + setColorsView(CupertinoColors.activeBlue), + setColorsView(CupertinoColors.activeGreen), + setColorsView(CupertinoColors.black), + setColorsView(CupertinoColors.destructiveRed), + setColorsView(CupertinoColors.inactiveGray), + setColorsView(CupertinoColors.lightBackgroundGray), + setColorsView(CupertinoColors.white) + ], + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoColors/index.dart b/lib/widgets/themes/Cupertino/CupertinoColors/index.dart new file mode 100644 index 00000000..b68cc15b --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoColors/index.dart @@ -0,0 +1,42 @@ +/** + * Created with Android Studio. + * User: 一晟 + * Date: 2019/1/20 + * Time: 下午10:57 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoButton 的示例 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> iOS平台常用的颜色 +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoColors 的一个是示例 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoColors'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoColorsFullDefault() + ], + title: 'CupertinoColors', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoColors-class.html', + codeUrl: '/themes/Cupertino/CupertinoColor/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoIcons/demo.dart b/lib/widgets/themes/Cupertino/CupertinoIcons/demo.dart new file mode 100644 index 00000000..73fa5e90 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoIcons/demo.dart @@ -0,0 +1,88 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoIcons 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_go/common/icon_names.dart' as icon_names; + +/* +* CupertinoIcons 默认的实例 +* */ +class CupertinoIconsFullDefault extends StatefulWidget { + const CupertinoIconsFullDefault() : super(); + + @override + State createState() => _CupertinoIconsFullDefault(); +} + +/* +* CupertinoIcons 默认的实例,有状态 +* */ +class _CupertinoIconsFullDefault extends State { + + final colorsList = []; + final List widgetList = []; + + Widget rowView(IconData itA,IconData itB){ + //print('itA=====>${itA.fontPackage}'); + return Row( + //mainAxisSize:MainAxisSize.max, + //crossAxisAlignment: CrossAxisAlignment.start, + //mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex:1, + child: CupertinoButton( + padding: EdgeInsets.only(left: 0), + child:FlatButton.icon( + label: Text('默认按钮', semanticsLabel: 'Add'), + icon:Icon(itA, + semanticLabel: 'Add', + ), + onPressed: () { }, + ))), + Expanded( + flex:1, + child: CupertinoButton( + padding: EdgeInsets.zero, + child:FlatButton.icon( + label: Text('默认按钮', semanticsLabel: 'Add'), + icon:Icon(itB, + semanticLabel: 'Add', + ), + onPressed: () { }, + ))), + ], + ); + } + + @override + void initState() { + super.initState(); + + final names = icon_names.CupertinoIIconNames.names; + for(var i=0;i Cupertino图标的标识符 +- 与Icon类一起使用以显示特定图标; +- 请确保cupertino_icons在项目的pubspec.yaml文件中添加依赖项。这可确保CupertinoIcons字体包含在您的应用程序中; +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoIcons 的一个示例 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoIcons'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoIconsFullDefault() + ], + title: 'CupertinoIcons', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoIcons-class.html', + codeUrl: '/themes/Cupertino/CupertinoColor/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoNavigationBar/demo.dart b/lib/widgets/themes/Cupertino/CupertinoNavigationBar/demo.dart new file mode 100644 index 00000000..beca7a45 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoNavigationBar/demo.dart @@ -0,0 +1,138 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoNavigationBar 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/* +* CupertinoNavigationBar 默认的实例 +* */ +class CupertinoNavigationBarFullDefault extends StatefulWidget { + const CupertinoNavigationBarFullDefault() : super(); + + @override + State createState() => _CupertinoNavigationBarFullDefault(); +} + +/* +* CupertinoNavigationBar 默认的实例,有状态 +* */ +class _CupertinoNavigationBarFullDefault extends State { + + @override + Widget build2(BuildContext context) { + return SizedBox( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + //height: 500.0, + child:CupertinoApp( + home: CupertinoTabScaffold( + tabBar: CupertinoTabBar( + items: const [ + BottomNavigationBarItem( + icon: Icon(CupertinoIcons.share), + title: Text('Tab 1'), + ), + BottomNavigationBarItem( + icon: Icon(CupertinoIcons.share), + title: Text('Tab 2'), + ), + ], + ), + tabBuilder: (BuildContext context, int index) { + // For 1-indexed readability. + ++index; + return CupertinoTabView( + builder: (BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Page 1 of tab $index'), + ), + child: Center( + child: CupertinoButton( + child: const Text('Next'), + onPressed: () { + Navigator.of(context).push( + CupertinoPageRoute( + builder: (BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Page 2 of tab $index'), + ), + child: Center( + child: CupertinoButton( + child: const Text('Back'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + ); + }, + ), + ); + }, + ), + ), + ); + }, + ); + }, + ), + ) + ); + } + + Widget build(BuildContext context) { + return SizedBox( + height: MediaQuery.of(context).size.height/1.5, + child: navigationBar(context) + ); + } + + Widget navigationBar(BuildContext context) { + return CupertinoPageScaffold( // 进入程序后显示的第一个页面,传入的是一个Widget,但实际上这个Widget需要包裹一个Scaffold + navigationBar: CupertinoNavigationBar( + leading: Icon(CupertinoIcons.back),// 放置在导航栏的开头。通常是正常页面的后退按钮或完整页面对话框的取消按钮 + middle: Text('Title'),// 放置在导航栏的中间。通常是标题或分段控件 + trailing: Icon(CupertinoIcons.share),// 放置在导航栏的末尾。通常在页面上执行其他操作,例如搜索或编辑功能 + actionsForegroundColor:CupertinoColors.white,// 用于 导航栏中前导和尾随小部件的文本和图标的默认颜色。 + backgroundColor:CupertinoColors.activeOrange,// 导航栏的背景颜色。如果它包含透明度,标签栏将自动对其背后的内容产生模糊效果 + border:Border( // 边框样式 + bottom: BorderSide(color: CupertinoColors.inactiveGray, width: 1.0), + ), + //heroTag :null, + previousPageTitle:'???',// 自动隐含前导按钮时手动指定上一个路线的标题 + transitionBetweenRoutes:true // 是否在导航栏之间转换 + ), + child: Center( + child: Text('这里是内容', style: TextStyle(color: Colors.black)) + ), // 应用程序默认路由,(Navigator.defaultRouteName,即/) + ); + } + + Widget tabBar(BuildContext context){ + return CupertinoTabBar( + items: const [ + BottomNavigationBarItem( + icon: Icon(CupertinoIcons.home), + title: Text('Home'), + ), + BottomNavigationBarItem( + icon: Icon(CupertinoIcons.conversation_bubble), + title: Text('Support'), + ), + BottomNavigationBarItem( + icon: Icon(CupertinoIcons.profile_circled), + title: Text('Profile'), + ), + ] + ); + } +} diff --git a/lib/widgets/themes/Cupertino/CupertinoNavigationBar/index.dart b/lib/widgets/themes/Cupertino/CupertinoNavigationBar/index.dart new file mode 100644 index 00000000..548170a0 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoNavigationBar/index.dart @@ -0,0 +1,54 @@ +/** + * Created with Android Studio. + * User: 一晟 + * Date: 2019/1/20 + * Time: 下午10:57 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoNavigationBar 的示例 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> ios 风格的 导航栏 +- 构成 toolbar 的最基本 widget,常规页面的 title,在 toolbar 居中显示; +- 当居中显示时,它支持通过设置 leading 和 trailing 属性对应的 widget,来决定是在中间 widget 前面还是后面显示; +- leading widget 将自动的成为一个返回 chevron icon button(或全屏对话框的关闭按钮),如果没有提供,则弹出当前路由,并且automaticallyImplyLeading为true(默认为true); +- 如果没有提供,并且 automaticallyImplyIdle 为true,则中间的 widget 将自动成为当前 CupertinoPageRoute 中的 title。 +- 它应该被放在屏幕的顶部,并自动占据操作系统的状态栏。 +- 如果给定 backgroundColor 的不透明度不是1.0(默认情况下为1.0),它将对其后面的内容产生模糊效果。 +- 当路 transitionBetweenRoutes 为 true,如果被切换的路由还拥有一个 CupertinaVigationBar 或一个 CupertinoSiverNavigationBar,并且 transitionBetweenRoutes 设置为 true,则此导航栏将在路由顶部而不是在路由内部进行切换。 +- 如果 transitionBetweenRoutes 为 true,则任何 widget 的参数,都不能在其子树中包含 key,因为该 widget 将同时存在于树中的多个位置。 +- 默认情况下,每个页面路由中只应存在一个 CupertinaVigationBar 或 CupertinoSiverNavigationBar,以支持默认切换。 +- 使用 transitionBetweenRoutes 或 Herotag 可自定义每个路由的多个导航栏的切换行为。 +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoNavigationBar 的一个示例 +- 通常被 CupertinoPageScaffold 包裹 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoNavigationBar'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoNavigationBarFullDefault(), + SizedBox(height:50) + ], + title: 'CupertinoApp', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoNavigationBar-class.html', + codeUrl: '/themes/Cupertino/CupertinoNavigationBar/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoPageRoute/demo.dart b/lib/widgets/themes/Cupertino/CupertinoPageRoute/demo.dart new file mode 100644 index 00000000..fcbaf478 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPageRoute/demo.dart @@ -0,0 +1,96 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPageRoute 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/* +* CupertinoPageRoute 默认的实例 +* */ +class CupertinoPageRouteFullDefault extends StatefulWidget { + const CupertinoPageRouteFullDefault() : super(); + + @override + State createState() => _CupertinoPageRouteFullDefault(); +} + +/* +* CupertinoPageRoute 默认的实例,有状态 +* */ +class _CupertinoPageRouteFullDefault extends State { + + Widget pageRoute(BuildContext context,int index){ + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Page 2 of tab $index'), + ), + child: Center( + child: CupertinoButton( + child: const Text('Back'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + //height: 500.0, + child:CupertinoApp( + home: CupertinoTabScaffold( + tabBar: CupertinoTabBar( + items: const [ + BottomNavigationBarItem( + icon: Icon(CupertinoIcons.share), + title: Text('无滑动的切换1'), + ), + BottomNavigationBarItem( + icon: Icon(CupertinoIcons.share), + title: Text('无滑动的切换2'), + ), + ], + ), + tabBuilder: (BuildContext context, int index) { + // For 1-indexed readability. + ++index; + return CupertinoTabView( + builder: (BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Page 1 of tab $index'), + ), + child: Center( + child: CupertinoButton( + child: const Text('点击我,看滑动动画'), + onPressed: () { + Navigator.of(context).push( + CupertinoPageRoute( + maintainState:false, // 是否前一个路由将保留在内存中 + builder: (BuildContext context) { // 生成器 + return pageRoute(context,index); + } + ) + ); + }, + ), + ), + ); + }, + ); + }, + ), + ) + ); + } +} diff --git a/lib/widgets/themes/Cupertino/CupertinoPageRoute/index.dart b/lib/widgets/themes/Cupertino/CupertinoPageRoute/index.dart new file mode 100644 index 00000000..3b442b76 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPageRoute/index.dart @@ -0,0 +1,47 @@ +/** + * Created with Android Studio. + * User: 一晟 + * Date: 2019/1/20 + * Time: 下午10:57 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPageRoute 的示例 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> ios 风格全屏切换路由的滑动动画 +- 页面从右侧滑入,然后反向退出。当另一页进入覆盖它时,视差中的页面也会向左移动; +- 页面从底部滑入,然后反向退出,全屏 dialogs 没有视差效果; +- 默认情况下,当切换路由被其他路由替换时,前一个路由将保留在内存中。若要在不需要时释放所有资源,请将 maintainstate 设置为 false; +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoPageRoute 的一个示例 +- 通常被 CupertinoPageScaffold 包裹 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoPageRoute'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoPageRouteFullDefault(), + SizedBox(height:50) + ], + title: 'CupertinoPageRoute', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoPageRoute-class.html', + codeUrl: '/themes/Cupertino/CupertinoPageRoute/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoPageScaffold/demo.dart b/lib/widgets/themes/Cupertino/CupertinoPageScaffold/demo.dart new file mode 100644 index 00000000..3f6cf02e --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPageScaffold/demo.dart @@ -0,0 +1,49 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPageScaffold 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/* +* CupertinoPageScaffold 默认的实例 +* */ +class CupertinoPageScaffoldFullDefault extends StatefulWidget { + const CupertinoPageScaffoldFullDefault() : super(); + + @override + State createState() => _CupertinoPageScaffoldFullDefault(); +} + +/* +* CupertinoPageScaffold 默认的实例,有状态 +* */ +class _CupertinoPageScaffoldFullDefault extends State { + @override + Widget build(BuildContext context) { + return SizedBox( + height: MediaQuery.of(context).size.height/1.5, + child: navigationBar(context) + ); + } + + Widget navigationBar(BuildContext context) { + return CupertinoPageScaffold( // 进入程序后显示的第一个页面,传入的是一个Widget,但实际上这个Widget需要包裹一个Scaffold + backgroundColor:CupertinoColors.extraLightBackgroundGray,// 整个脚手架下面的 widget 的颜色 + navigationBar: CupertinoNavigationBar( + leading: Icon(CupertinoIcons.back),// 放置在导航栏的开头。通常是正常页面的后退按钮或完整页面对话框的取消按钮 + middle: Text('这里是标题'),// 放置在导航栏的中间。通常是标题或分段控件 + trailing: Icon(CupertinoIcons.share),// 放置在导航栏的末尾。通常在页面上执行其他操作,例如搜索或编辑功能 + ), + child: Center( + child: Text('这里是内容', style: TextStyle(color: Colors.black)) + ), // 应用程序默认路由,(Navigator.defaultRouteName,即/) + resizeToAvoidBottomInset:false // child 是否应该调整自己的大小以避免窗口的底部插入 + ); + } +} diff --git a/lib/widgets/themes/Cupertino/CupertinoPageScaffold/index.dart b/lib/widgets/themes/Cupertino/CupertinoPageScaffold/index.dart new file mode 100644 index 00000000..050346ff --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPageScaffold/index.dart @@ -0,0 +1,45 @@ +/** + * Created with Android Studio. + * User: 一晟 + * Date: 2019/1/20 + * Time: 下午10:57 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPageScaffold 的示例 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> 实现单个 iOS 应用程序页的页面布局 +- 一个 CupertinoPage 重要布局; +- 脚手架在顶部设置导航栏,在导航栏之间或之后设置内容; +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoPageScaffold 的一个示例 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoPageScaffold'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoPageScaffoldFullDefault(), + SizedBox(height:50) + ], + title: 'CupertinoPageScaffold', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoPageScaffold-class.html', + codeUrl: '/themes/Cupertino/CupertinoPageScaffold/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoPicker/demo.dart b/lib/widgets/themes/Cupertino/CupertinoPicker/demo.dart new file mode 100644 index 00000000..6a327ab9 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPicker/demo.dart @@ -0,0 +1,291 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPageScaffold 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:intl/intl.dart'; + +//import '../../gallery/demo.dart'; +//import 'cupertino_navigation_demo.dart' show coolColorNames; + +const double _kPickerSheetHeight = 216.0; +const double _kPickerItemHeight = 32.0; + +const List coolColorNames = [ + 'Sarcoline', 'Coquelicot', 'Smaragdine', 'Mikado', 'Glaucous', 'Wenge', + 'Fulvous', 'Xanadu', 'Falu', 'Eburnean', 'Amaranth', 'Australien', + 'Banan', 'Falu', 'Gingerline', 'Incarnadine', 'Labrador', 'Nattier', + 'Pervenche', 'Sinoper', 'Verditer', 'Watchet', 'Zaffre', +]; + +class CupertinoPickerDemo extends StatefulWidget { + static const String routeName = '/cupertino/picker'; + + @override + _CupertinoPickerDemoState createState() => _CupertinoPickerDemoState(); +} + +class _CupertinoPickerDemoState extends State { + int _selectedColorIndex = 0; + + Duration timer = const Duration(); + + // Value that is shown in the date picker in date mode. + DateTime date = DateTime.now(); + + // Value that is shown in the date picker in time mode. + DateTime time = DateTime.now(); + + // Value that is shown in the date picker in dateAndTime mode. + DateTime dateTime = DateTime.now(); + + Widget _buildMenu(List children) { + return Container( + decoration: BoxDecoration( + color: CupertinoTheme.of(context).scaffoldBackgroundColor, + border: const Border( + top: BorderSide(color: Color(0xFFBCBBC1), width: 0.0), + bottom: BorderSide(color: Color(0xFFBCBBC1), width: 0.0), + ), + ), + height: 44.0, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: SafeArea( + top: false, + bottom: false, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: children, + ), + ), + ), + ); + } + + Widget _buildBottomPicker(Widget picker) { + return Container( + height: _kPickerSheetHeight, + padding: const EdgeInsets.only(top: 6.0), + color: CupertinoColors.white, + child: DefaultTextStyle( + style: const TextStyle( + color: CupertinoColors.black, + fontSize: 22.0, + ), + child: GestureDetector( + // Blocks taps from propagating to the modal sheet and popping. + onTap: () {}, + child: SafeArea( + top: false, + child: picker, + ), + ), + ), + ); + } + + Widget _buildColorPicker(BuildContext context) { + final FixedExtentScrollController scrollController = + FixedExtentScrollController(initialItem: _selectedColorIndex); + + return GestureDetector( + onTap: () async { + await showCupertinoModalPopup( + context: context, + builder: (BuildContext context) { + return _buildBottomPicker( + CupertinoPicker( + magnification:1.0, // 整体放大率 + //offAxisFraction:10.0,// 球面效果的透视系数,消失点位置 + scrollController: scrollController,// 用于读取和控制当前项的FixedxtentScrollController + itemExtent: _kPickerItemHeight,// 所以子节点 统一高度 + backgroundColor: CupertinoColors.white,// 所有子节点下面的背景颜色 + useMagnifier:true,// 是否使用放大效果 + onSelectedItemChanged: (int index) { // 当正中间选项改变时的回调 + setState(() => _selectedColorIndex = index); + }, + children: List.generate(coolColorNames.length, (int index) { + return Center(child: + Text(coolColorNames[index]), + ); + }), + ), + ); + }, + ); + }, + child: _buildMenu( + [ + const Text('Favorite Color'), + Text( + coolColorNames[_selectedColorIndex], + style: const TextStyle( + color: CupertinoColors.inactiveGray + ), + ), + ], + ), + ); + } + + Widget _buildCountdownTimerPicker(BuildContext context) { + return GestureDetector( + onTap: () { + showCupertinoModalPopup( + context: context, + builder: (BuildContext context) { + return _buildBottomPicker( + CupertinoTimerPicker( + initialTimerDuration: timer, + onTimerDurationChanged: (Duration newTimer) { + setState(() => timer = newTimer); + }, + ), + ); + }, + ); + }, + child: _buildMenu( + [ + const Text('Countdown Timer'), + Text( + '${timer.inHours}:' + '${(timer.inMinutes % 60).toString().padLeft(2,'0')}:' + '${(timer.inSeconds % 60).toString().padLeft(2,'0')}', + style: const TextStyle(color: CupertinoColors.inactiveGray), + ), + ], + ), + ); + } + + Widget _buildDatePicker(BuildContext context) { + return GestureDetector( + onTap: () { + showCupertinoModalPopup( + context: context, + builder: (BuildContext context) { + return _buildBottomPicker( + CupertinoDatePicker( + mode: CupertinoDatePickerMode.date, + initialDateTime: date, + onDateTimeChanged: (DateTime newDateTime) { + setState(() => date = newDateTime); + }, + ), + ); + }, + ); + }, + child: _buildMenu( + [ + const Text('Date'), + Text( + DateFormat.yMMMMd().format(date), + style: const TextStyle(color: CupertinoColors.inactiveGray), + ), + ] + ), + ); + } + + Widget _buildTimePicker(BuildContext context) { + return GestureDetector( + onTap: () { + showCupertinoModalPopup( + context: context, + builder: (BuildContext context) { + return _buildBottomPicker( + CupertinoDatePicker( + mode: CupertinoDatePickerMode.time, + initialDateTime: time, + onDateTimeChanged: (DateTime newDateTime) { + setState(() => time = newDateTime); + }, + ), + ); + }, + ); + }, + child: _buildMenu( + [ + const Text('Time'), + Text( + DateFormat.jm().format(time), + style: const TextStyle(color: CupertinoColors.inactiveGray), + ), + ], + ), + ); + } + + Widget _buildDateAndTimePicker(BuildContext context) { + return GestureDetector( + onTap: () { + showCupertinoModalPopup( + context: context, + builder: (BuildContext context) { + return _buildBottomPicker( + CupertinoDatePicker( + mode: CupertinoDatePickerMode.dateAndTime, + initialDateTime: dateTime, + onDateTimeChanged: (DateTime newDateTime) { + setState(() => dateTime = newDateTime); + }, + ), + ); + }, + ); + }, + child: _buildMenu( + [ + const Text('Date and Time'), + Text( + DateFormat.yMMMd().add_jm().format(dateTime), + style: const TextStyle(color: CupertinoColors.inactiveGray), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height:MediaQuery.of(context).size.height, + child:CupertinoPageScaffold( +// navigationBar: CupertinoNavigationBar( +// middle: const Text('Picker'), +// previousPageTitle: 'Cupertino' +// ), + child: DefaultTextStyle( + style: CupertinoTheme.of(context).textTheme.textStyle, + child: DecoratedBox( + decoration: BoxDecoration( + color: CupertinoTheme.of(context).brightness == Brightness.light + ? CupertinoColors.extraLightBackgroundGray + : CupertinoColors.darkBackgroundGray, + ), + child: ListView( + children: [ + const Padding(padding: EdgeInsets.only(top: 32.0)), + _buildColorPicker(context), + _buildCountdownTimerPicker(context), + _buildDatePicker(context), + _buildTimePicker(context), + _buildDateAndTimePicker(context), + ], + ), + ), + ), + ) + ); + + } +} diff --git a/lib/widgets/themes/Cupertino/CupertinoPicker/index.dart b/lib/widgets/themes/Cupertino/CupertinoPicker/index.dart new file mode 100644 index 00000000..30ab6e2e --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPicker/index.dart @@ -0,0 +1,45 @@ +/** + * Created with Android Studio. + * User: 一晟 + * Date: 2019/1/20 + * Time: 下午10:57 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPicker 的示例 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> iOS风格的选择器 +- 以 wheel 的方式显示子 widget,选择发生改变后的回调; +- 通常和 showModalBottomSheet 搭配在屏幕底部显示 picker 选择器; +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoPicker 的一个示例 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoPicker'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoPickerDemo(), + SizedBox(height:50) + ], + title: 'CupertinoPicker', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoPicker-class.html', + codeUrl: '/themes/Cupertino/CupertinoPicker/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/CupertinoPopupSurface/demo.dart b/lib/widgets/themes/Cupertino/CupertinoPopupSurface/demo.dart new file mode 100644 index 00000000..92651e4d --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPopupSurface/demo.dart @@ -0,0 +1,45 @@ +/** + * Created with Android Studio. + * User: ryan + * Date: 2019/1/20 + * Time: 上午11:34 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPopupSurface 的示例 + */ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/* +* CupertinoPopupSurface 默认的实例 +* */ +class CupertinoPopupSurfaceFullDefault extends StatefulWidget { + const CupertinoPopupSurfaceFullDefault() : super(); + + @override + State createState() => _CupertinoPopupSurfaceFullDefault(); +} + +/* +* CupertinoPopupSurface 默认的实例,有状态 +* */ +class _CupertinoPopupSurfaceFullDefault extends State { + @override + Widget build(BuildContext context) { + return SizedBox( + height: MediaQuery.of(context).size.height/5, + child: CupertinoPopupSurfaceBar(context) + ); + } + + Widget CupertinoPopupSurfaceBar(BuildContext context) { + return CupertinoPopupSurface( + isSurfacePainted:false, + child: Container( + color: CupertinoColors.inactiveGray, + alignment: Alignment.center, + child: Text('这里是内容', style: TextStyle(color: Colors.white)) + ), // 应用程序默认路由,(Navigator.defaultRouteName,即/) + ); + } +} diff --git a/lib/widgets/themes/Cupertino/CupertinoPopupSurface/index.dart b/lib/widgets/themes/Cupertino/CupertinoPopupSurface/index.dart new file mode 100644 index 00000000..742a6134 --- /dev/null +++ b/lib/widgets/themes/Cupertino/CupertinoPopupSurface/index.dart @@ -0,0 +1,44 @@ +/** + * Created with Android Studio. + * User: 一晟 + * Date: 2019/1/20 + * Time: 下午10:57 + * email: zhu.yan@alibaba-inc.com + * tartget: CupertinoPopupSurface 的示例 + */ +import 'package:flutter/material.dart'; +import '../../../../common/widget_demo.dart'; +import './demo.dart' as demoBox; + +const String content0 = ''' +### **简介** +> 像iOS弹出式表面 +- 快速实现一个圆角弹框,类似 alert dialog 和 sheet; +'''; + +const String content1 = ''' +### **基本用法** +> CupertinoPopupSurface 的一个示例 +'''; + +class Demo extends StatefulWidget { + static const String routeName = '/themes/Cupertino/CupertinoPopupSurface'; + _DemoState createState() => _DemoState(); +} + +class _DemoState extends State { + @override + Widget build(BuildContext context) { + return WidgetDemo( + contentList: [ + content0, + content1, + demoBox.CupertinoPopupSurfaceFullDefault(), + SizedBox(height:50) + ], + title: 'CupertinoPopupSurface', + docUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoPopupSurface-class.html', + codeUrl: '/themes/Cupertino/CupertinoPopupSurface/demo.dart', + ); + } +} \ No newline at end of file diff --git a/lib/widgets/themes/Cupertino/index.dart b/lib/widgets/themes/Cupertino/index.dart index 9ee67326..c773292f 100644 --- a/lib/widgets/themes/Cupertino/index.dart +++ b/lib/widgets/themes/Cupertino/index.dart @@ -1,14 +1,73 @@ import "package:flutter/material.dart"; import '../../../model/widget.dart'; + + +import './CupertinoApp/index.dart' as CupertinoApp; +import './CupertinoButton/index.dart' as CupertinoButton; +import './CupertinoColors/index.dart' as CupertinoColors; +import './CupertinoIcons/index.dart' as CupertinoIcons; +import './CupertinoNavigationBar/index.dart' as CupertinoNavigationBar; +import './CupertinoPageRoute/index.dart' as CupertinoPageRoute; +import './CupertinoPageScaffold/index.dart' as CupertinoPageScaffold; +import './CupertinoPicker/index.dart' as CupertinoPicker; +import './CupertinoPopupSurface/index.dart' as CupertinoPopupSurface; + import './CupertinoScrollbar/index.dart' as CupertinoScrollbar; import './CupertinoSlider/index.dart' as CupertinoSlider; import './CupertinoSegmentedControl/index.dart' as CupertinoSegmentedControl; import './CupertinoSliverNavigationBar/index.dart' as CupertinoSliverNavigationBar; import './CupertinoSwitch/index.dart' as CupertinoSwitch; + import './CupertinoTabBar/index.dart' as CupertinoTabBar; import './CupertinoTabScaffold/index.dart' as CupertinoTabScaffold; import './CupertinoTabView/index.dart' as CupertinoTabView; + List widgetPoints = [ + WidgetPoint( + name: 'CupertinoPopupSurface', + routerName: CupertinoPopupSurface.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoPopupSurface.Demo(), + ), + WidgetPoint( + name: 'CupertinoPicker', + routerName: CupertinoPicker.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoPicker.Demo(), + ), + WidgetPoint( + name: 'CupertinoPageScaffold', + routerName: CupertinoPageScaffold.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoPageScaffold.Demo(), + ), + WidgetPoint( + name: 'CupertinoPageRoute', + routerName: CupertinoPageRoute.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoPageRoute.Demo(), + ), + WidgetPoint( + name: 'CupertinoNavigationBar', + routerName: CupertinoNavigationBar.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoNavigationBar.Demo(), + ), + WidgetPoint( + name: 'CupertinoIcons', + routerName: CupertinoIcons.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoIcons.Demo(), + ), + WidgetPoint( + name: 'CupertinoColors', + routerName: CupertinoColors.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoColors.Demo(), + ), + WidgetPoint( + name: 'CupertinoButton', + routerName: CupertinoButton.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoButton.Demo(), + ), + WidgetPoint( + name: 'CupertinoApp', + routerName: CupertinoApp.Demo.routeName, + buildRouter: (BuildContext context) => CupertinoApp.Demo(), + ), WidgetPoint( name: 'CupertinoScrollbar', routerName: CupertinoScrollbar.Demo.routeName, @@ -55,3 +114,4 @@ List widgetPoints = [ buildRouter: (BuildContext context) => CupertinoTabView.Demo(), ), ]; + diff --git a/lib/widgets/themes/index.dart b/lib/widgets/themes/index.dart index 3589c009..6c61cd40 100644 --- a/lib/widgets/themes/index.dart +++ b/lib/widgets/themes/index.dart @@ -6,10 +6,11 @@ */ import './Material/index.dart' as Material; -import './Cupertino/index.dart' as Cupertion; +import './Cupertino/index.dart' as Cupertino; + List getWidgets() { List result = []; result.addAll(Material.widgetPoints); - result.addAll(Cupertion.widgetPoints); + result.addAll(Cupertino.widgetPoints); return result; } \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index efd45c4a..a4020b99 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,6 +30,8 @@ dependencies: shared_preferences: ^0.4.3 dio: ^1.0.6 flutter_webview_plugin: ^0.3.0+2 + # 日期格式化 + intl: 0.15.7 dev_dependencies: flutter_test: @@ -171,10 +173,17 @@ flutter: - lib/widgets/themes/Cupertino/CupertinoTabView/demo.dart - assets/app.db - assets/images/ + - assets/fonts/ - lib/common/example_code_parser.dart - lib/common/syntax_highlighter.dart - + fonts: + - family: FlamanteRoma + fonts: + - asset: assets/fonts/Flamante-Roma-Medium.ttf + - asset: assets/fonts/Lato-Bold.ttf + - asset: assets/fonts/Flamante-Roma-MediumItalic.ttf + style: italic # To add assets to your application, add an assets section, like this: # assets: