티스토리 뷰

Flutter

flutter err

바람사탕 2022. 6. 24. 13:05
반응형

Target of URI doesn't exist: 'package:sensors/sensors.dart'.

Target of URI doesn't exist: 'package:path_provider/path_provider.dart'.

 

flutter packages get  안됨

flutter packages upgrade 안됨

 

 

 

Flutter\AccelerometerEvent'��(��) ���� �Ǵ� �ܺ� ����, ������ �� �ִ� ���α׷�, �Ǵ�

경로명이 다 깨짐. 전부 영어임.

 

 

 

 

 

flutter doctor

[☠] Visual Studio - develop for Windows (the doctor check crashed)
    X Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know
      about this issue at https://github.com/flutter/flutter/issues.
    X Exception: Bad UTF-8 encoding (U+FFFD; REPLACEMENT CHARACTER) found while decoding string: [
        {
          "instanceId": "ab5a89cf",
          "installDate": "2022-06-08T04:25:36Z",
          "installationName": "VisualStudio/17.2.3+32526.322",
          "installationPath": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional",
          "installationVersion": "17.2.32526.322",
          "productId": "Microsoft.VisualStudio.Product.Professional",
          "productPath": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\Common7\\IDE\\devenv.exe",
          "state": 4294967295,
          "isComplete": true,
          "isLaunchable": true,
          "isPrerelease": false,
          "isRebootRequired": false,
          "displayName": "Visual Studio Professional 2022",
          "description": "�ұԸ� ���� ���� ������ ���� IDE",
          "channelId": "VisualStudio.17.Release",
          "channelUri": "https://aka.ms/vs/17/release/channel",
          "enginePath": "C:\\Program Files (x86)\\Microsoft Visual
          Studio\\Installer\\resources\\app\\ServiceHub\\Services\\Microsoft.VisualStudio.Setup.Service",
          "installedChannelUri": "https://aka.ms/vs/17/release/channel",

 

Info

For 427 years the Mostar Bridge in what is now kno

www.bing.com

 

 

flutter 다시 다운받아서 압축풀고 flutter doctor하니 모든게 다 정상(삭제가 제대로 안된듯)

 

 

새로운 git 소스 받아서 돌리니,

The getter 'subhead' isn't defined for the type 'TextTheme'

 

 

flutter channel master
flutter pub get
Launching lib\main.dart on SM J710K in debug mode...
Running Gradle task 'assembleDebug'...
lib/widgets.dart:138:52: Error: The getter 'body1' isn't defined for the class 'TextTheme'.
 - 'TextTheme' is from 'package:flutter/src/material/text_theme.dart' ('/D:/Flutter/packages/flutter/lib/src/material/text_theme.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'body1'.
                style: Theme.of(context).textTheme.body1?.copyWith(
                                                   ^^^^^
lib/widgets.dart:186:56: Error: The getter 'body1' isn't defined for the class 'TextTheme'.
 - 'TextTheme' is from 'package:flutter/src/material/text_theme.dart' ('/D:/Flutter/packages/flutter/lib/src/material/text_theme.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'body1'.
                    style: Theme.of(context).textTheme.body1?.copyWith(
                                                       ^^^^^
lib/widgets.dart:248:20: Error: The getter 'body1' isn't defined for the class 'TextTheme'.
 - 'TextTheme' is from 'package:flutter/src/material/text_theme.dart' ('/D:/Flutter/packages/flutter/lib/src/material/text_theme.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'body1'.
                  .body1
                   ^^^^^
lib/widgets.dart:292:53: Error: The getter 'subhead' isn't defined for the class 'TextTheme'.
 - 'TextTheme' is from 'package:flutter/src/material/text_theme.dart' ('/D:/Flutter/packages/flutter/lib/src/material/text_theme.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'subhead'.
          style: Theme.of(context).primaryTextTheme.subhead,
                                                    ^^^^^^^
lib/widgets.dart:296:53: Error: The getter 'subhead' isn't defined for the class 'TextTheme'.
 - 'TextTheme' is from 'package:flutter/src/material/text_theme.dart' ('/D:/Flutter/packages/flutter/lib/src/material/text_theme.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'subhead'.
          color: Theme.of(context).primaryTextTheme.subhead?.color,
                                                    ^^^^^^^


FAILURE: Build failed with an exception.

* Where:
Script 'D:\Flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1156

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> Process 'command 'D:\Flutter\bin\flutter.bat'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 16s
Exception: Gradle task assembleDebug failed with exit code 1

에러가 계속나옴...

 

style: ElevatedButton.styleFrom(
                        primary: Colors.pinkAccent,//change background color of button
                        onPrimary: Colors.yellow,//change text color of button
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(25),
                        ),
                        elevation: 15.0,
                      ),

 

 

The getter 'body1' isn't defined for the type 'TextTheme'.

bodyText1

 

 

 

flutter doctor : 설치환경 확인하는 기능
flutter clean : 빌드과정에서 생긴 임시파일들 삭제
flutter upgrade : 현재 설정 업그레이드
flutter pub cache repair : 문제점이 있다면 수정(백업후 빨간색 에러는 많을 경우, 대부분 사라짐)
flutter pub get

flutter, Dart, 안드로이드 Lib, 개발환경이 계속 변하고 있어, 몇년전 소스코드가 동작하지 않을 수 도 있음

최신 버젼으로 빌드하면 오류메세지가 발생할 수 있다.
flutter를 다운그레이드하면 된다고 함.
flutter --version
flutter downgrade v1.2.1
flutter --version

백그라운드 실행
https://medium.com/flutter/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124
https://pub.dev/packages/flutter_background_service


FlutterBluePlugin.java uses or overrides a deprecated API.
add @SuppressWarnings("deprecation") on top of startScan18 and stopScan18


Widget List 위젯 리스트 목록
Widget Becon_MAC_LIST_to_WidgetList()
{
  return new Row(children: Becon_MAC_LIST.map((item) => new Text(item)).toList());
}

The number of method references in a .dex file cannot exceed 64K.
┌─ Flutter Fix
│ Flutter multidex handling is disabled. If you wish to let the tool configure multidex, use the │
│ --multidex flag.
=>
defaultConfig {
...
multiDexEnabled true
}



FlutterBluePlugin.h' (OS Error: 클라이언트가 필요한 권한을 가지고 있지 않습니다.

class MyPage extends StatelessWidget {
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column( // 컨테이너 위젯
          children: [
            SizedBox(height: 100.0,), //Column이기 때문에 width는 Column에 맞춰서 자동으로 적용됨
            Text('How to use Sizedbox'),
            SizedBox(height: 50.0,),
            TextButton(
              style: TextButton.styleFrom(
                backgroundColor: Colors.yellow,
                primary: Colors.red, // foreground
              ),
              onPressed: () { },
              child: Text('press!'),
            )
          ],
          ),
      ),
    );
  }
}

가운데 정렬
Widget Widget_v_center(Widget a)
{
  return Expanded(child:Container(
    child: Align(
      alignment: Alignment.center,
      child:a,),),);
}

//이전페이지로 가기
void go_back(BuildContext context) {
  Navigator.pop(context);
}

AppBar 높이
PreferredSize AppBar1(String title,BuildContext context)
{
  return PreferredSize( //wrap with PreferredSize
      preferredSize: Size.fromHeight(AppBar_height), //height of appbar
      child: AppBar(title: Text(title,maxLines: 2,
        overflow: TextOverflow.ellipsis,),
        actions: [
          IconButton(icon: Image.asset("img/map.png"),onPressed: ()=>Navigator.push(context, MaterialPageRoute(builder: (context) => Page_Map1())),),
          IconButton(icon: Image.asset("img/Setup.png"),onPressed: ()=>Navigator.push(context, MaterialPageRoute(builder: (context) => Page_Setup())),),
          network_on_off_Icon(),
          WD_bat_icon(),
        ],),);
}


바닥 맨밑에 이미지
Widget BottomImage(String Asset_img_file)
{
  return Expanded(child:Container(
      child: Align(
      alignment: Alignment.bottomCenter,
      child:Image(image: AssetImage(Asset_img_file),),),),);
}

Container 크기지정
Container(
          width:paint_w,
          height:paint_h,


여러줄 text
multi line text
Text(title,maxLines: 2,
      overflow: TextOverflow.ellipsis,),


Container(
                //전체 색이 다 바뀐다. color:BkColor,
                
                //배경색만 바꾸려면 아래와 같이 한다
                decoration: BoxDecoration(
                  color: BkColor,
                ),


Text('Tutorial', style: TextStyle(fontSize: 20.0))]),  

Image(image: AssetImage("img/Logo-TitleBar.png"),),

TextButton(
                    child: Text("지도"),
                    onPressed: onPressed_Btn1,
                    style: TextButton.styleFrom(
                      backgroundColor: Btn_BkColor,
                      //primary: Btn_TextColor,
                    ),
                  ),


체크박스
class LabeledCheckbox extends StatelessWidget {
  const LabeledCheckbox({
    Key? key,
    required this.label,
    required this.value,
    required this.onChanged,
  }) : super(key: key);

  final String label;
  final bool value;
  final Function onChanged;

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        onChanged(!value);
      },
      child: Row(
        children: <Widget>[
          Checkbox(
            value: value,
            onChanged: (bool? newValue) {
              onChanged(newValue);
            },
          ),
          Text(label),
        ],
      ),
    );
  }
}



setState : 호출하면, build가 실행되어, 화면이 갱신된다.
화면을 갱신하려면, StatefulWidget class의 setState를 호출해줘야한다.
화면 갱신이 필요한 TextCheckbox같은 것을 사용할때는 setState때문에 함수형으로 사용이 어렵다.
예)
LabeledCheckbox(label:"옵션1",value:Option1,onChanged:(bool bChecked){setState((){Option1=bChecked;});}),


//상하좌우 여백추가
Padding(
          padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 30),
          child: Row(
            mainAxisSize: MainAxisSize.max,
            children: [
              Flexible(
                  flex: 15, // 15%
                  child: Container(
                    color: Colors.amber,
                    alignment: Alignment.center,
                    child: Column(),
                  )),
              Flexible(
                  flex: 60, // 60%
                  child: Container(
                    color: Colors.green,
                    alignment: Alignment.center,
                    child: Column(),
                  )),
              Flexible(
                  flex: 25, // 25%
                  child: Container(
                    color: Colors.pink,
                    alignment: Alignment.center,
                    child: Column(),
                  ))
            ],
          ),
        ),
      ),

SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp,]);//화면 회전금지//import 'package:flutter/services.dart' ;

InkWell ImgButton(String img_file,void Function()? on_click)
{
  return InkWell(
      onTap: on_click,
      child: Image.asset(img_file),
    );
}

//InkWell보다는 IconButton이 나은듯
IconButton(
            icon: Image.asset('assets/logo.png'), 
            onPressed: () { },
          ),


File read, write
simple_permissions 
Building with plugins requires symlink support.
=>윈도우10 제어판 개발자 모드 : ON

Please enable Developer Mode in your system settings. Run
  start ms-settings:developers
to open settings.


절전모드 wi-fi wifi
WifiManager.WifiLock wifiLock = null;
//등록
if (wifiLock == null) {
                WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
    wifiLock = wifiManager.createWifiLock("wifilock");
    wifiLock.setReferenceCounted(true);
    wifiLock.acquire();
}
//해제
if (wifiLock != null) {
                wifiLock.release();
    wifiLock = null;
}

화면꺼도 실행
PowerManager.WakeLock wakeLock = null;
//등록
if (wakeLock == null) {
    PowerManager powerManager = (PowerManager) context.getSystemService(context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "wakelock");
    wakeLock.acquire();
}
//해제
if (wakeLock != null) {
    wakeLock.release();
    wakeLock = null;
}



The plugin `simple_permissions` uses a deprecated version of the Android embedding.
Android V2 embedding






 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
    <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCOUNT_MANAGER"/>
    <uses-permission android:name="android.permission.ADD_VOICEMAIL"/>
    <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.BATTERY_STATS"/>
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_APPWIDGET"/>
    <uses-permission android:name="android.permission.BIND_AUTOFILL_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_CARRIER_SERVICES"/>
    <uses-permission android:name="android.permission.BIND_CHOOSER_TARGET_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_CONDITION_PROVIDER_SERVICE."/>
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN"/>
    <uses-permission android:name="android.permission.BIND_DREAM_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_INCALL_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>
    <uses-permission android:name="android.permission.BIND_NFC_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_MIDI_DEVICE_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_PRINT_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_QUICK_SETTINGS_TILE"/>
    <uses-permission android:name="android.permission.BIND_REMOTEVIEWS"/>
    <uses-permission android:name="android.permission.BIND_SCREENING_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_TEXT_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_TV_INPUT"/>
    <uses-permission android:name="android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_VOICE_INTERACTION"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BIND_WALLPAPER"/>
    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BIND_VR_LISTENER_SERVICE"/>
    <uses-permission android:name="android.permission.BIND_VPN_SERVICE"/>
    <uses-permission android:name="android.permission.BODY_SENSORS"/>
    <uses-permission android:name="android.permission.BRICK"/>
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED"/>
    <uses-permission android:name="android.permission.BROADCAST_SMS"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    <uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
    <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/>
    <uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT"/>
    <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"/>
    <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
    <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
    <uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
    <uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
    <uses-permission android:name="android.permission.DELETE_PACKAGES"/>
    <uses-permission android:name="android.permission.DEVICE_POWER"/>
    <uses-permission android:name="android.permission.DIAGNOSTIC"/>
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
    <uses-permission android:name="android.permission.DUMP"/>
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
    <uses-permission android:name="android.permission.FACTORY_TEST"/>
    <uses-permission android:name="android.permission.FLASHLIGHT"/>
    <uses-permission android:name="android.permission.FORCE_BACK"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
    <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO"/>
    <uses-permission android:name="android.permission.GLOBAL_SEARCH"/>
    <uses-permission android:name="android.permission.HARDWARE_TEST"/>
    <uses-permission android:name="android.permission.INJECT_EVENTS"/>
    <uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"/>
    <uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
    <uses-permission android:name="android.permission.INSTALL_SHORTCUT"/>
    <uses-permission android:name="android.permission.INSTANT_APP_FOREGROUND_SERVICE"/>
    <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
    <uses-permission android:name="android.permission.LOCATION_HARDWARE"/>
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.MANAGE_APP_TOKENS"/>
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
    <uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
    <uses-permission android:name="android.permission.MASTER_CLEAR"/>
    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.NFC"/>
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
    <uses-permission android:name="android.permission.PERSISTENT_ACTIVITY"/>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_FRAME_BUFFER"/>
    <uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS"/>
    <uses-permission android:name="android.permission.READ_INPUT_STATE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_PROFILE"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.READ_SOCIAL_STREAM"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
    <uses-permission android:name="android.permission.READ_USER_DICTIONARY"/>
    <uses-permission android:name="android.permission.READ_VOICEMAIL"/>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.REBOOT"/>
    <uses-permission android:name="android.permission.SEND_RESPOND_VIA_MESSAGE"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
    <uses-permission android:name="android.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.SET_ALWAYS_FINISH"/>
    <uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
    <uses-permission android:name="android.permission.SET_DEBUG_APP"/>
    <uses-permission android:name="android.permission.SET_ORIENTATION"/>
    <uses-permission android:name="android.permission.SET_POINTER_SPEED"/>
    <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
    <uses-permission android:name="android.permission.SET_PROCESS_LIMIT"/>
    <uses-permission android:name="android.permission.SET_TIME"/>
    <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
    <uses-permission android:name="android.permission.SET_WALLPAPER"/>
    <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
    <uses-permission android:name="android.permission.TRANSMIT_IR"/>
    <uses-permission android:name="android.permission.UNINSTALL_SHORTCUT"/>
    <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
    <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
    <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
    <uses-permission android:name="android.permission.USE_SIP"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
    <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_GSERVICES"/>
    <uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS"/>
    <uses-permission android:name="android.permission.WRITE_PROFILE"/>
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM"/>
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY"/>
    <uses-permission android:name="android.permission.WRITE_VOICEMAIL"/>



ACCESS_FINE_LOCATION : GPS, 네트워크를 사용해 위치 정보 확인
ACCESS_COARSE_LOCATION : 네트워크만 사용해 위치 정보 확인
ACCESS_BACKGROUND_LOCATION : 위치 권한 허용을 물어볼 때, 항상 허용 옵션이 추가된다. 
해당 permission 을 추가하지 않았을 때에는 "앱 사용 중에만 허용" 만 나타났다. 
다만, BLE 디바이스 스캔시에는 ACCESS_COARSE_LOCATION 으로 권한을 얻은 경우에는 되지 않았고, 
ACCESS_FINE_LOCATION 으로 권한을 얻어야만 가능했다.



TextField 초기값 넣기
TextField(
    controller:TextEditingController()..text=text,
    onChanged:onChanged,
    textAlign:TextAlign.center,
    decoration: InputDecoration(
    border: OutlineInputBorder(),
      //labelText://윗쪽
      //helperText: text,//아랫쪽
      hintText:text,
  ),);


stful 치면 StatefulWidget관련 클래스 2개가 만들어짐



Cannot get size during build.


화면 회전금지(화면 고정)
Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([//import 'package:flutter/services.dart' ;
      DeviceOrientation.portraitUp,
    ]);
    return Scaffold(...


GFAppBar(//import 'package:getwidget/getwidget.dart';//flutter pub add getwidget
            leading:  GFIconButton(
              icon: Icon(
                Icons.message,
                color: Colors.white,
              ),
              onPressed: () {},
              type: GFButtonType.transparent,
            ),
            searchBar: true,
            title: Text("GF Appbar"),//한글 출력이 안됨
            actions: <Widget>[
              GFIconButton(
                icon: Icon(
                  Icons.favorite,
                  color: Colors.white,
                ),
                onPressed: () {},
                type: GFButtonType.transparent,
              ),
            ],
          ),



AppBar 높이 조정
appBar: PreferredSize( //wrap with PreferredSize
       preferredSize: Size.fromHeight(AppBar_height), //height of appbar
       child: AppBar(
          title: Text(title),
          ),
       ),
//조정은 가능하지만, 뒤로 화살표가 밀려서, 사용안하는것이 좋다.


//화면 페이지 전환
class FlutterBlueApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      color: Colors.lightBlue,
      home: StreamBuilder<BluetoothState>(
          stream: FlutterBlue.instance.state,
          initialData: BluetoothState.unknown,
          builder: (c, snapshot) {
            final state = snapshot.data;
            if (state == BluetoothState.on) {
              return FindDevicesScreen();
            }
            return BluetoothOffScreen(state: state);
          }),
    );
  }
}







이미지 추가
프로젝트 폴더에 img 폴더 생성
pubspec.yaml 수정
flutter:
  uses-material-design: true
  assets:
    - img/

안드로으드 스튜디오 하단의 터미널에서
flutter pub get

소스코드
Image(image: AssetImage("img/Logo-TitleBar.png"),),




import 'package:flutter/services.dart' show rootBundle;
Future<String> loadAsset() async {
  return await rootBundle.loadString('assets/config.json');
  return const Image(image: AssetImage('graphics/background.png'));
}
AssetManager assetManager = registrar.context().getAssets();
String key = registrar.lookupKeyForAsset("icons/heart.png");
AssetFileDescriptor fd = assetManager.openFd(key);


ANDROID_HOME=D:\AndroidStudioSDK
PATH=D:\Flutter\bin;D:\AndroidStudioSDK;D:\AndroidStudioSDK\platform-tools;


Failed to apply plugin 'com.android.internal.application'.
=> 한글 경로명 에러


web 기능 추가
flutter_console.bat실행
해당 프로젝트로가서
flutter config --enable-web
flutter create .
하면 web 디렉토리가 생성됨



Name non-constant identifiers using lowerCamelCase.
lowerCamelCase, UpperCamelCase
Camel:낙타
Case:(대)문자,(소)문자
lowerCamelCase:첫문자는 소문자, 다음 단어의 첫문자는 대문자(가독성). 'l'이 소문자이다.
UpperCamelCase:첫문자는 대문자, 다음단어의 첫문자는 대문자(가독성). 'U'이 소문자이다.
Dart언어는 첫문자가 소문자인 lowerCamelCase을 사용한다.
C언어처럼 첫문자를 대문자로 사용하면, 에러발생.
에러메세지:Name non-constant identifiers using lowerCamelCase
예) void DelaySec(int s) //ERR
예) void delaySec(int s) //OK
요약:Dart에서는 첫문자는 소문자를 사용해라.

Dart에서는 함수명에 밑줄은 로컬함수만 사용가능하다.
C처럼 밑줄을 사용하지 말라.
예) double_To_int()  //err
예) doubleToInt()  //ok
※밑줄표시가 되지만, 실행은 된다.





double to int 형변환
Dart에서는 형변환 없음(클래스). 멤버함수를 사용해야함.
예) double a=1.0;
    int i=a.toInt();

The await expression can only be used in an async function in flutter


Sound(견고한) null safety
소스코드상에서 null값을 참조하지 않도록, 또는 피하도록 함.
(실행시간에 비교가 아니라, 아예 소스코드 부터 null문제를 해결하고자 함)
런타임(실행중)시 if문으로 null검사 자체를 안함.
(항상 null이 아닌 소스코드이므로, 또는 null일 수 도 있는 소스코드이므로.)
if문으로 null검사하는것이 아니라, ?, ??, !, required,late 등으로 null값을 허용하는 변수임을 표시.
(개념은 좋은데, 실제로는?)
String s1=null;//error
String? s2=null;//ok

UnSound(불량한) null safety
null safety한 소스코드(라이브러리)와 "UnSound(불량한) null safety"한 소스코드(라이브러리)는
함께 사용 할 수 있다.(변환필요)
dart pub upgrade --null-safety
$ dart pub get


import 'dart:io';
main(){
sleep(const Duration(seconds:1));
}



socketData() async {
        Socket socket = await Socket.connect('192.168.0.1', 4005);
        print('connected');


        // send 0
        socket.add(utf8.encode('0'));
        socket.listen((List<int> event)  {

          setState(()  {
            weightSO = utf8.decode(event);
            
            // data decryption
            var key = '11111';
            weightRT = await  FlutterAesEcbPkcs5.decryptString(weightSO, key);

     });

          print(utf8.decode(event));
        });
        weightRT = await FlutterAesEcbPkcs5.decryptString(utf8.decode(event), key);
        socket.add(utf8.encode('0'));
        await Future.delayed(Duration(seconds: 300));
        socket.close();
      }

    }


APK 파일이름, 타이틀, 아이콘 변경
<application
          android:name="io.flutter.app.FlutterApplication"
          android:label="Woolha App"
          android:icon="@mipmap/launcher_icon">

<key>CFBundleName</key>
  <string>Woolha App</string>

<key>CFBundleName</key>
  <string>Woolha App</string>

flutter_icons:
    android: true
    ios: true
    image_path: "assets/images/favicon.png"

outputFileName

flutter_blue_example

pauldemarco.Accelerometer


아이콘은 png파일이다.
\android\app\src\main\res


pubspec.yaml : 프로젝트 셋팅정보
Scaffold : 골격, 비계(건축에서 지지대, 동바리), 구성틀, 구성 시스템. 큰 틀(title, body)


No MediaQuery widget ancestor found.
    paint_w=MediaQuery.of(context).size.width;//app bar 높이 포함안됨
    paint_h=MediaQuery.of(context).size.height;
//0값이 나오는 문제가 있다.
//MediaQuery는 특정 클래스에서는 사용불가
if (InitialData.phoneSize.width == 0 || InitialData.phoneSize.height == 0) {
  return Container(
    child: Center(
      child: Text("Loading..."),
    ),
  );
} else {
  return SafeArea(
    ...
  );
}



kotlin_version 때문에 빌드 안되는 문제
Edit->Find->Find in files에서 "kotlin_version"검색후 버젼 숫자 수정
버전 숫자는 https://kotlinlang.org/docs/gradle.html#plugin-and-versions  에 나온 숫자 입력
ext.kotlin_version = '1.6.20'


[!] Your project requires a newer version of the Kotlin Gradle plugin.


flutter_send_sms-master
동작됨





The plugin `flutter_sms` uses a deprecated version of the Android embedding.
=>flutter pub remove flutter_sms





The non-nullable variable 'pageState' must be initialized.
=>null을 허용하지 않는 경우, 초기값을 어떻게 설정해야하는가?



Undefined class 'Uint8List'.
=>import 'dart:typed_data';


async,await,Future,final
await : 대기. 기다림. 멈춤
async : 비동기, 각자 진행
Future : 미래(완료)
final : 마지막, 최종에는. (최종에는) 초기화가 되어야 한다.

await 키워드를 사용한 함수는 무조건 async 함수 이어야 한다.
async 함수는 무조건 Future를 반환해야 한다.
예) 
Future doSomething async()
{
socket = await funcX();
}

void main()
{
final a=doSomething();
...
}



백그라운드 프로세싱 방법
workmanager
대소문자 구분
D:\Project\wearable\Flutter\example>flutter pub add workmanager
import 'package:workmanager/workmanager.dart';

Workmanager.registerOneOffTask(
  "1",//Delayed background work
  "registerOneOffTask",
  initialDelay: Duration(seconds: 10),
);

Workmanager.registerPeriodicTask(
  "2",// Periodic background work
  "registerPeriodicTask",
  initialDelay: Duration(seconds: 10),
);
https://medium.com/flutterworld/flutter-perform-background-job-9bce92f0a21e


import 'dart:async';

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:workmanager/workmanager.dart';

const String TAG = "BackGround_Work";

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager.initialize(
      callbackDispatcher, // The top level function, aka callbackDispatcher
      isInDebugMode: false // This should be false
      );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'BackGround Work Sample',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BackGroundWorkSample(),
    );
  }
}

class BackGroundWorkSample extends StatefulWidget {
  @override
  _BackGroundWorkSampleState createState() => _BackGroundWorkSampleState();
}

class _BackGroundWorkSampleState extends State<BackGroundWorkSample> {
  int _counterValue = 0;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    //This task runs periodically
    //It will wait at least 10 seconds before its first launch
    //Since we have not provided a frequency it will be the default 15 minutes
    Workmanager.registerPeriodicTask(
      TAG,
      "simplePeriodicTask",
      initialDelay: Duration(seconds: 10),
    );
    loalData();
  }

  void loalData() async {
    _counterValue =
        await BackGroundWork.instance._getBackGroundCounterValue();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('BackGround Work Sample'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Text("Counter Value: ${_counterValue}"),
              RaisedButton(onPressed: () {
                loalData();
              }, child: Text("Fetch Current Counter Value"),)
            ],
          ),
        ));
  }
}

void callbackDispatcher() {
  Workmanager.executeTask((task, inputData) async {
    print(TAG + "callbackDispatcher");
    int value =
        await BackGroundWork.instance._getBackGroundCounterValue();
    BackGroundWork.instance._loadCounterValue(value + 1);
    return Future.value(true);
  });
}

class BackGroundWork {
  BackGroundWork._privateConstructor();

  static final BackGroundWork _instance =
  BackGroundWork._privateConstructor();

  static BackGroundWork get instance => _instance;

  _loadCounterValue(int value) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setInt('BackGroundCounterValue', value);
  }

  Future<int> _getBackGroundCounterValue() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    //Return bool
    int counterValue = prefs.getInt('BackGroundCounterValue') ?? 0;
    return counterValue;
  }
}


//@
Instance member 'initialize' can't be accessed using static access. 



//@
Running Gradle task 'assembleDebug'...
멈춤.
=>


flutter pub add workmanager
Because workmanager depends on workmanager, version solving failed.
pub finished with exit code 65
=>flutter update-packages


Error: The getter 'body1' isn't defined for the class 'TextTheme'
=> body1 => bodyText1

Error: The getter 'subhead' isn't defined for the class 'TextTheme'.
=> subhead => subtitle1


Your project requires a higher compileSdkVersion.
=> compileSdkVersion 30 => compileSdkVersion 31


Warning: You are using these overridden dependencies:
=>flutter clean(안됨)
flutter pub cache repair


This app is using a deprecated version of the Android embedding.
=>

Scope: Non-Project Files
Object is not abstract and does not implement abstract member public abstract fun error
=>프로젝트 다시 생성하니 되는듯 함. 프로젝트 생성 실패가 종종 발생함.
flutter pub remove workmanager
workmanager 를 제거하니, 정상 빌드됨.

'error' overrides nothing
=>프로젝트 다시 생성하니 되는듯 함. 프로젝트 생성 실패가 종종 발생함.
flutter pub remove workmanager
workmanager 를 제거하니, 정상 빌드됨.

FAILURE: Build failed with an exception.
=>


Building with plugins requires symlink support.
=>빌드중에 flutter pub get 명령 사용한 경우

Error: Type 'Socket' not found.
=>


Disable sound null safety
dart --no-sound-null-safety run
flutter run --no-sound-null-safety

스마트폰 화면 꺼지면, 블루투스 검색 안되는 문제
=>
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />






Target of URI doesn't exist: 'package:flutter/material.dart'.
=>flutter pub upgrade flutter_blue



이미지 수정 edit
ui.imageFromBytes
final ui.Image image = ...;

// Convert to raw rgba
final ByteData bytes = image.toByteData(format: 
  ImageByteFormat.rawRgba,
);

// Set the first pixel of the image to red.
bytes.setUint32(0, 0xFF0000FF);

// Set pixel at (x, y) to green.
final x = 10;
final y = 10;
bytes.setUint32((y * image.width + x) * 4, 0x00FF00FF);

ui.decodeImageFromPixels(
  bytes.buffer.asUint8List(),
  image.width,
  image.height,
  ui.PixelFormat.rgba8888,
  (ui.Image result) {
    // use your result image
  },
);




터치 마우스 좌표 입력
import 'package:flutter/material.dart';

class GridPage extends StatelessWidget {
  const GridPage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(//마우스좌표 mouse
        onTapDown: (detail) {
          print("onTapDown:(${detail.localPosition})");
        },
        onTapUp: (detail) {
          print("onTapUp(${detail.localPosition})");
        },
        onHorizontalDragUpdate: (detail) {
          print("onHorizontalDragUpdate:(${detail.localPosition})");
        },
        child: CustomPaint(
          child: Container(),
          painter: GridPainter(),
        ),
      ),
    );
  }
}

class GridPainter extends CustomPainter {
  static const gridWidth = 50.0;
  static const gridHeight = 50.0;

  var _width = 0.0;
  var _height = 0.0;

  void _drawBackground(Canvas canvas) {
    var paint = Paint()
      ..style = PaintingStyle.fill
      ..color = Colors.lime
      ..isAntiAlias = true;

    Rect rect = Rect.fromLTWH(0, 0, _width, _height);
    canvas.drawRect(rect, paint);
  }

  void _drawGrid(Canvas canvas) {
    var paint = Paint()
      ..style = PaintingStyle.fill
      ..color = Colors.black38
      ..isAntiAlias = true;

    final rows = _height / gridHeight;
    final cols = _width / gridWidth;

    for (int r = 0; r < rows; r++) {
      final y = r * gridHeight;
      final p1 = Offset(0, y);
      final p2 = Offset(_width, y);

      canvas.drawLine(p1, p2, paint);
    }

    for (int c = 0; c < cols; c++) {
      final x = c * gridWidth;
      final p1 = Offset(x, 0);
      final p2 = Offset(x, _height);

      canvas.drawLine(p1, p2, paint);
    }
  }

  @override
  void paint(Canvas canvas, Size size) {
    _width = size.width;
    _height = size.height;

    _drawBackground(canvas);
    _drawGrid(canvas);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => false;
}



No MediaQuery widget ancestor found.
ancestor:조상(부모)
WidgetsApp,CupertinoApp,MaterialApp등은 MediaQuery ancestor가 없는것들인데,
MediaQuery를 찾아서 에러이다.
"home:"에서 Build하면 된다.

@override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App name',
      home: Builder(builder: (BuildContext context) { 
      ...
      } ),
가로,세로 크기얻는데, 뭔 이wf까지해야하는지...원....



GlobalKey https://nsinc.tistory.com/214
ValueKey, ObjectKey, UniqueKey, PageStorageKey, GlobalKey
???


A value of type 'Size?' can't be assigned to a variable of type 'Size'.
null safety
Size s=context.size; //에러발생
Size ?s=context.size;//ok

터치이벤트(마우스)
GestureDetector
Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: SafeArea(
        child: Scaffold(
          appBar: AppBar(
            title: Text("Accelerometer 자이로 센서 V1.0"),
          ),
          body: GestureDetector(//Appbar 높이차이 없음
            onTapDown: (detail) {
              //print("onTapDown:(${detail.localPosition})");
              onPointerMove_down_up1(detail.localPosition.dx,detail.localPosition.dy);
            },
            onTapUp: (detail) {
              //print("onTapUp(${detail.localPosition})");
              onPointerMove_down_up1(detail.localPosition.dx,detail.localPosition.dy);
            },
            onHorizontalDragUpdate: (detail) {//move
              //print("onHorizontalDragUpdate:(${detail.localPosition})");
              onPointerMove_down_up1(detail.localPosition.dx,detail.localPosition.dy);
            },
            child: Column(
              children: [
                CustomPaint(
                  child: Container(),
                  painter: ShapePainter3(),//on_paint
                ),
                //20220525
                Text30("X="+dtoa2(Accelerometer_x/10.0)+",  Y="+dtoa2(Accelerometer_y/10.0)+
                    ",  Z="+dtoa2(Accelerometer_z/10.0)),
              ],
            ),
          ),
        ),
      ),
    );
  }

 

 

 

 

// TODO:

검색

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함