본문 바로가기
버킷리스트/앱 만들기

오공완 (with Do it! 플러터 앱 프로그램밍) #9_1

by 또또도전 2024. 5. 10.
반응형

// 이곳에 쓴 내용은 앱 만들기라는 버킷리스트를 달성하기 위해 플러터를 공부하면서 정리하고 있는 내용입니다.

플러터에 대해 아는 것이 거의 없기 때문에 정리하면서 오류가 있을 수 있습니다.

오류를 발견하신 분은 댓글 남겨 주시면 감사하겠습니다.

 

   공유 환경 설정에 데이터 저장하기

 

pubspec.yaml에 shared_preferences 패키지 등록 후, 아래처럼 main다트 파일에 코드를 입력했는데, 작동을 안 한다. 취지는 앱을 종료하고 다시 켰을 때 기존에 카운트 됐던 내용이 그대로 살아있어야 하는데, 여전히 0으로 나온다.

 

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        ),
      home: const MyHomePage(title: 'Flutter Demo Home Page',),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
      _setData(_counter);
    });
  }

  @override
  void initState() {
    super.initState();
    _loadData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

void _setData(int value) async {
  var key = "count";
  SharedPreferences pref = await SharedPreferences.getInstance();
  pref.setInt(key, value);
}

void _loadData() async {
  var key = "count";
  SharedPreferences pref = await SharedPreferences.getInstance();
  setState(() {
    var value = pref.getInt(key);
    if (value == null) {
      _counter = 0;
    } else {
      _counter = value;
    }
  });
}
}

 

그리고, 다시 깃허브 3.X버전으로 위처럼 타이핑해서 결국 해결했다. 중간에 {를 잘못 넣은 부분도 있고, 코드의 순서가 완전히 다른 느낌이었다. 물론, 내가 책을 잘못 해석해서 코드를 넣었을 수도 있을 것이다.

책에는 '생략'이라고 표시되어 있는 부분이 있는데 그런 것 때문에 위치를 잘못 넣은 것일 수도 있겠다.

 

오늘은 불금이니 여기까지만..

반응형